2010-05-01 4 views
2

Я хотел бы взять файл, являющийся файлом IL, и во время выполнения скомпилировать его обратно в exe.Скомпилировать код IL во время выполнения с использованием .NET 3.5 и C# из файла

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

Есть ли способ сделать это с отражением и отражением?

В то время как это работает:

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.

Спасибо.

+0

Возможно, вы сможете использовать методы Reflection.Emit или dynamic в зависимости от того, откуда взялся ваш IL. Это сгенерировано? –

+0

Оригинальный IL будет создан на основе Ildasm.exe. – nitefrog

ответ

4

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

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

+0

Hello Jon, Спасибо за ответ. Просто кажется, что вы говорите «неуклюжий». Но если это единственный способ сделать это, я думаю, что я застрял, называя командную строку. Другая проблема заключается в том, что это будет услуга, и может время от времени стать немного тяжелой. Я не уверен, как вызывать использование командной строки. Мне просто нравится иметь более отполированное приложение. Благодарю. – nitefrog

+0

@nitefrog: Я понимаю предпочтение библиотеки за нереста процесса, но если это сработает, я бы придерживался этого на данный момент. Вы должны, вероятно, разработать свою нагрузку и выполнить нагрузочный тест на раннем этапе, чтобы узнать, сможете ли вы справиться с этим. –

+0

Cecil - это библиотека управления сборками. Он читает и записывает сборки, а не файлы IL. –

1

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