在编译后,是否可以在.NET DLL中添加/删除/更改嵌入式资源?如果是这样,这是怎么做的,有没有陷阱?
修改
我想手动执行此操作,但最终会自动通过构建后事件中的脚本执行此操作。
答案 0 :(得分:19)
它非常简单,仅需3行代码。你需要的是引用mono.cecil.dll(google it!) 和
var targetasmdef = AssemblyFactory.GetAssembly("My.dll");
//May seach for the one you need
targetasmdef.MainModule.Resources.RemoveAt(0);
AssemblyFactory.SaveAssembly(targetasmdef, "My2.dll");
答案 1 :(得分:16)
在托管代码中无法执行此操作。一旦资源被嵌入,它就像编译的MSIL代码一样成为程序集的一部分。
然而,您可以手动执行此操作,例如suggested by Lucero,方法是使用ildasm将DLL拆分为文本文件,使用文本编辑器删除资源,最后使用ilasm重新组装DLL。
以下是使用带有单个嵌入文本文件的DLL的示例:
1)将DLL反编译为MSIL:
ildasm MyLibrary.dll /out=MyLibrary.il
2)打开生成的MyLibrary.il
文件,然后移除.mresource
部分:
.mresource public MyLibrary.MyResource.txt
{
// Offset: 0x00000000 Length: 0x0000000F
// WARNING: managed resource file MyLibrary.MyResource.txt created
}
3)从修改后的MyLibrary.il
文件中重新组装DLL:
ilasm MyLibrary.il /dll
答案 2 :(得分:6)
是的,这可以通过ILDASM
和ILASM
进行往返来替换中间的嵌入文件。
陷阱: