0

我正在尝试创建一个应用程序可以修改 IL 中的属性以创建一个略有不同的可执行文件。例如,客户端 A 运行应用程序,并且 WinForm 标签上的标签读取“客户端 A:”。客户端 B 运行应用程序,标签显示“客户端 B”。容易我知道使用配置文件或资源文件,但这不是这个项目的选择。主程序需要能够根据用户输入的一些表单域动态生成.exe文件。

我的解决方案是创建一个独立的可执行文件,其中包含我需要动态化的所有元素。然后我使用 ildasm 生成 IL 并认为我可以使用这个 IL 并用标签替换我想要动态的元素。然后,在用户使用正则表达式等填写表单后,我可以在运行时替换这些标签。问题是,如果我将 ILDASM 生成的 IL 文件另存为 exe 并尝试运行它。我只是启动控制台,什么都不做。

我会以错误的方式解决这个问题吗?我不想深入研究反射,因为动态 .exe 非常简单,我认为使用 ildasm 对 IL 进行逆向工程是最快的方法。

非常感谢您的想法和建议。托尼

4

2 回答 2

0

当您说“重新保存”由 ildasm 创建的文件并运行它时,您是否意味着您正在通过ilasm(提供的 Microsoft IL 编译器)运行所有 IL 文件?如果没有,您可能想尝试一下。执行替换时要非常小心,因为 IL 有一些非常具体的要求,而且 ilasm 不像 csc 和 vbc 等高级编译器那样宽容。

您还可以使用Mono.Cecil修改程序集文件,这样您就不必将 IL 发送给您的客户。

如果您要继续发送源代码并编译它,您可以通过发送 C# 源代码并在现场编译它来完成相同的事情,而无需涉及 IL,因为csc包含在框架中。

于 2010-04-08T21:07:21.777 回答
0

可执行文件是现场生成的吗?还是您为客户生成可执行文件然后发送结果?

如果您是生成可执行文件的人,您可以将客户特定的数据/代码放在单独的 DLL 中,并将其作为资源嵌入到您的可执行文件中,并在 AppDomain.CurrentDomain.AssemblyResolve 事件发生时加载它。

这样,您就可以对特定于客户的数据进行版本控制。

于 2010-04-06T14:35:38.933 回答