簡體   English   中英

使用.NET 3.5和文件中的C#在運行時編譯IL代碼

[英]Compile IL code at runtime using .NET 3.5 and C# from file

我想獲取一個IL文件,並在運行時將其編譯回exe。

現在,我可以使用process.start來啟動帶有參數(ilasm.exe)的命令行,但是我想從我將創建的C#服務中自動執行此過程。

有沒有辦法用反射和reflect.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。

謝謝。

“簡化的流程”是什么意思? 它對您的表現還不夠好嗎? 我知道產生一個單獨的過程有點臟,但這是我想到的最簡單的方法。 擁有適當的權限,您仍然應該可以通過服務執行此操作。

您需要類似CSharpCodeProvider的東西,但要使用IL。 恐怕我不知道上這樣的課。

實際上,許多混淆器(例如preemtiveBitHelmet)都使用ilasm.exe和Process。 我認為這是最好的策略。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM