使用.NET 3.5和C#在运行时在运行时编译IL代码

时间:2010-05-01 06:34:58

标签: c# compiler-construction runtime .net-assembly ilasm

我想获取一个IL文件的文件,并在运行时将其编译回exe。

现在我可以使用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。

感谢。

2 个答案:

答案 0 :(得分:4)

“精简流程”是什么意思?它的表现不够好吗?我知道产生一个单独的过程会感觉有点脏,但这是我能想到的最简单的方法。使用适当的权限,您仍然可以从服务中执行此操作。

你想要像CSharpCodeProvider这样的东西,但对于IL;我不知道有什么这样的课,我很害怕。

答案 1 :(得分:1)

实际上,许多混淆器,如preemtiveBitHelmet使用ilasm.exe和Process。我认为这是最好的策略。

相关问题