C# - kompilowanie kodu vbs do exe

0

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

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1