C# 打开DLL并重写

C# 打开DLL并重写,c#,wpf,dll,C#,Wpf,Dll,当我编译我的一个程序时,有一个DLL。DLL包含软件显示的图像。我做了另一个软件,一个配置程序。我希望它能够打开DLL,用用户选择的任何图像替换横幅和仅横幅图像,然后重新编译为DLL。我如何才能做到这一点?您可能希望与资源API和朋友一起工作。有微软认可的策略,特别是PE映像的资源部分 但是,我建议在C中使用一个大数组,它以某个魔术序列开始,并扩展到已知的大小。然后,在替换数组时,搜索神奇序列,只替换DLL中的字节。查看。Cecil是一种工具(API),允许您更改/重写程序集的IL代码。它还应该

当我编译我的一个程序时,有一个DLL。DLL包含软件显示的图像。我做了另一个软件,一个配置程序。我希望它能够打开DLL,用用户选择的任何图像替换横幅和仅横幅图像,然后重新编译为DLL。我如何才能做到这一点?

您可能希望与资源API和朋友一起工作。

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


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

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

请注意,使用这种方法会产生副作用,特别是,它会破坏程序集上的任何代码签名


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

你应该考虑使用.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上有一个编译器构造函数项目可能会有一些用处。它有像PeaseMblyReader和PeaseMblyWriter这样的类(不太确定确切的名称),但是这些类允许读写PE文件。PE代表可移植可执行文件,是Windows用于可执行文件的格式。但是,在这个选项中,您需要确切地知道如何修改内存中的PE结构,并写出修改后的PE结构


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

您确定UpdateResource可以更改.NET程序集中的资源吗?本机DLL和托管资源中的资源格式不同。如何使用编译器创建DLL。请详细说明第一种选择,谢谢。