打开DLL并重写

时间:2009-07-28 14:58:25

标签: c# wpf dll

编译我的一个程序时会生成一个DLL。 DLL包含软件显示的图像。我制作了另一个软件,一个配置器。我希望它能够打开DLL替换横幅,只有横幅,图像与用户选择的任何图像,然后重新编译成一个DLL。我怎么能这样做?

5 个答案:

答案 0 :(得分:2)

您可能希望使用资源API - UpdateResource和朋友。

答案 1 :(得分:2)

有微软认可的策略,特别是PE图像的资源部分。

但是,我建议在C中使用一个大型数组,该数组以某个魔术序列开头,并扩展到已知大小。然后,在替换数组时,搜索魔术序列,然后只替换DLL中的字节。

答案 2 :(得分:1)

看看Mono - Cecil。 Cecil是一种工具(API),允许您更改/重写程序集的IL代码。它还应该重写资源。

答案 3 :(得分:1)

您应该考虑使用.NET中提供的内置C#或VB.NET编译器动态编译DLL。实现编译器的确切类是Microsoft.CSharp.CSharpCodeProvider和Microsoft.VisualBasic.VBCodeProvider。两者都在System.dll程序集中定义。

或者,您也可以使用随.NET Framework一起安装的csc.exe,vbc.exe和resgen.exe应用程序来生成DLL。

这可以通过使用System.Diagnostics.Process类生成进程来完成。使用它,您可以捕获Console.In和Console.Out流,以将控制台I / O重定向到StreamReader / StreamWriter,以便与Configurator功能紧密集成。

话虽如此,我认为更好的选择是第一个,你使用实际的编译器类,而不是调用可执行文件(内部只调用编译器类)。

如果所有其他方法都失败了,CodePlex上有一个可能有用的编译器构造函数项目。它有PEAssemblyReader和PEAssemblyWriter类(不太确定确切的名称),但这些类允许读取和写入PE文件。 PE代表可移植可执行文件,是Windows用于可执行文件的格式。但是,在这个选项中,您需要确切地知道如何修改内存中的PE结构,并写出修改后的PE结构。

我仍然认为第一个选项是使用的选项,除非你在运行时没有这些DLL的源代码。

答案 4 :(得分:0)

请注意,您对此采取的任何方法都会产生副作用 - 特别是,它会破坏程序集上的任何代码签名。

您可能需要考虑使用程序集加载的单独资源文件。这使得更新变得微不足道。如果您有多个资源,甚至可以使用某种形式的简单数据库。