Chciałbym za pomocą mojego programu skompilować kod VBS ze stringa bezpośrednio do exe.
Jest możliwość zrobienia takiego czegoś?
PS: nie chcę za pomocą exe uruchamiać skryptu VBS :)
0
0
Jest możliwe, ale jest to bardzo trudne.
Musiałbyś między innymi:
- poznać budowę plików EXE PE (jeżeli zamierzasz kompilować dla Windows)
- opracować kod przekształcający VBS -> ASM x86, co z całą pewnością nie jest łatwe
- opracować kod budujący plik EXE na podstawie kodu ASM i zgodnie ze strukturą EXE PE
Ewentualnie zamiast ASM musiałbyś dokładnie znać kod języka pośredniego dla środowiska NET lub Javy.
Być może analiza kodu źródłowego dowolnego kompilatora open source coś pomoże.
0
A jest jakaś metoda (dosyć prosta do zrobienia) aby skompilować kod ze stringa (C#) i zapisać go do EXE?
PS: a mogę dostać jakieś linki do kompilatorów, których mogę użyć? (zamiast pisania ich)
0
[offtop]Aż z ciekawości wpisałem w Google vbs to exe.[/offtop]
0
kompilowanie c# ze stringa aż tak skomplikowa nie jest.
string code ="using System;"+
"public static class Example"+
"{"+
"public static void DoSomeThing()"+
"{"+
"Console.WriteLine(\"wywołanie metody\");"+
"}"+
"static void Main()"+
"{"+
"}"+
"}";
"
private string Run(string code, out bool error)
{
string method_result = string.Empty;
error = false;
CompilerResults C_results = null;
CSharpCodeProvider code_provider = new CSharpCodeProvider();
CompilerParameters compiler_parameters = new CompilerParameters();
compiler_parameters.GenerateExecutable = true;
C_results = code_provider.CompileAssemblyFromSource(compiler_parameters, code);
if (C_results.Errors.HasErrors)
{
error = true;
string error_message = string.Empty;
for (int i = 0; i < C_results.Errors.Count; i++)
{
error_message += C_results.Errors[i].ErrorText + Environment.NewLine;
}
method_result = error_message;
}
else
{
StringWriter swriter = new StringWriter();
Console.SetOut(swriter);
//przykladowe wywołanie metody z kompilowanego kodu
Type driverType = C_results.CompiledAssembly.GetType("Example");
driverType.InvokeMember("DoSomeThing", System.Reflection.BindingFlags.InvokeMethod |
System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public,
null,null, null);
method_result = swriter.ToString();
}
return method_result;
}
tego exeka wsadza gdzies w documents and settings/profil uzytkownika/ustawienia lokalne/temp i nazywa go losowo, ale moze to też da się gdzieś ustawić, reszte zostawiam Tobie