2

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

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

谢谢。

4

2 回答 2

4

您所说的“简化流程”是什么意思?它对你来说表现还不够好吗?我知道生成一个单独的进程感觉有点脏,但这是我能想到的最简单的方法。使用适当的权限,您仍然应该能够从服务中执行此操作。

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

于 2010-05-01T07:07:55.143 回答
1

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

于 2010-05-01T15:58:01.090 回答