我正在尝试创建一个可以在IL中修改属性的应用程序,以创建一个稍微不同的可执行文件。例如,客户端A运行应用程序,WinForm标签上的标签显示“客户端A:”。客户端B运行应用程序,标签显示“客户端B”。我知道使用配置文件或资源文件很容易,但这不是这个项目的选项。主程序需要能够根据用户输入的一些表单字段动态生成.exe文件。
我的解决方案是创建一个独立的可执行文件,其中包含我需要使其动态化的所有元素。然后我使用ildasm来生成IL,并认为我可以使用这个IL并用标签替换我想要使其成为动态的元素。然后我可以在运行时替换那些标签,在用户使用regex等填充表单后。问题是,如果我将由ILDASM生成的IL文件保存为可执行文件并尝试运行它。我只是启动控制台,什么也不做。
我是不是走错路了?我不想深入研究反射,因为动态.exe非常简单,我认为使用ildasm对IL进行逆向工程将是最快的方法。
非常感谢您的想法和指点。托尼
发布于 2010-04-06 22:35:39
可执行文件是现场生成的吗?或者,您会为客户生成可执行文件,然后发送结果吗?
如果您是生成可执行文件的人,则可以将特定于客户的数据/代码放在单独的DLL中,并将其作为资源嵌入到可执行文件中,然后在发生AppDomain.CurrentDomain.AssemblyResolve事件时加载它。
这样,您就可以对特定于客户的数据进行版本控制。
发布于 2010-04-09 05:07:22
当你说“重新保存”ildasm创建的文件并运行它时,你的意思是你正在通过ilasm (微软提供的IL编译器)运行所有的IL文件吗?如果没有,您可能想要尝试一下。在执行替换时一定要非常小心,因为IL有一些非常具体的要求,而ilasm不像csc和vbc这样的高级编译器那么宽松。
您还可以使用Mono.Cecil修改程序集文件,这样就不必将IL提供给您的客户。
如果您打算继续发布源代码并编译它,您可以通过发布C#源代码并在现场编译它来完成相同的事情,因为csc包含在框架中。
https://stackoverflow.com/questions/2585440
复制相似问题