是否可以在.NET DLL中添加/删除/更改嵌入式资源?

时间:2011-07-01 09:10:21

标签: .net dll resources

在编译后,是否可以在.NET DLL中添加/删除/更改嵌入式资源?如果是这样,这是怎么做的,有没有陷阱?

修改

我想手动执行此操作,但最终会自动通过构建后事件中的脚本执行此操作。

3 个答案:

答案 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)

是的,这可以通过ILDASMILASM进行往返来替换中间的嵌入文件。

陷阱:

  • 如果程序集具有强名称,则需要强名称密钥文件,否则最终不会获得相同的程序集名称
  • 如果程序集是使用证书签名的,则需要包含私钥的证书才能在需要时重新签名
  • 由于名称问题,混淆的程序集可能无法进行往返