Скомпилируйте код IL во время выполнения, используя .NET 3.5 и C # из файла - PullRequest
2 голосов
/ 01 мая 2010

Я хотел бы взять файл, который является файлом IL, и во время выполнения скомпилировать его обратно в исполняемый файл.

Сейчас я могу использовать process.start для запуска командной строки с параметрами (ilasm.exe), но я хотел бы автоматизировать этот процесс из службы C #, которую я создам.

Есть ли способ сделать это с помощью отражения и отражения.emit?

Пока это работает:

string rawText = File.ReadAllText(string.Format("c:\\temp\\{0}.il", Utility.GetAppSetting("baseName")), Encoding.ASCII);

rawText = rawText.Replace("[--STRIP--]", guid);

File.Delete(string.Format("c:\\temp\\{0}.il", Utility.GetAppSetting("baseName")));

File.WriteAllText(string.Format("c:\\temp\\{0}.il", Utility.GetAppSetting("baseName")),rawText, Encoding.ASCII);

pi = new ProcessStartInfo();
pi.WindowStyle = ProcessWindowStyle.Hidden;
pi.FileName = "\"" + ilasm + "\"";
pi.Arguments = string.Format("c:\\temp\\{0}.il", Utility.GetAppSetting("baseName"));

using(Process p = Process.Start(pi))
{
    p.WaitForExit();
}

Это не идеально, так как я действительно хотел бы, чтобы это был упрощенный процесс.

Я видел примеры создания IL во время выполнения, затем сохранения, но мне нужно использовать IL, который у меня уже есть, в виде файла и скомпилировать его обратно в exe.

Спасибо.

Ответы [ 2 ]

4 голосов
/ 01 мая 2010

Что вы подразумеваете под «оптимизированным процессом»? Это не достаточно хорошо для вас? Я знаю, что немного грязно порождать отдельный процесс, но это самый простой способ, о котором я могу думать. С соответствующими разрешениями вы все равно сможете сделать это из службы.

Вы хотите что-то вроде CSharpCodeProvider, но для IL; Боюсь, я не знаю ни одного такого класса.

1 голос
/ 01 мая 2010

На самом деле многие обфускаторы, такие как preemtive и BitHelmet , используют ilasm.exe и Process. Я думаю, что это лучшая стратегия.

...