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

Mas*_*Mas 19 .net dll resources

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

编辑:

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

dex*_*t2k 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");
Run Code Online (Sandbox Code Playgroud)

  • 我编写了一个可以替代嵌入式资源的小程序:https://github.com/qerub/ReplaceEmbeddedAssemblyResource (6认同)

Enr*_*lio 16

在托管代码中无法执行此操作.一旦资源被嵌入,它就像编译的MSIL代码一样成为程序集的一部分.

但是,您可以手动执行此操作,如Lucero建议,使用ildasm将DLL拆分为文本文件,使用文本编辑器删除资源,最后使用ilasm重新组装DLL .

以下是使用带有单个嵌入文本文件的DLL的示例:

1)将DLL反编译为MSIL:

ildasm MyLibrary.dll /out=MyLibrary.il
Run Code Online (Sandbox Code Playgroud)

2)打开生成的MyLibrary.il文件并删除.mresource部分:

.mresource public MyLibrary.MyResource.txt
{
  // Offset: 0x00000000 Length: 0x0000000F
  // WARNING: managed resource file MyLibrary.MyResource.txt created
}
Run Code Online (Sandbox Code Playgroud)

3)从修改后的MyLibrary.il文件中重新组装DLL :

ilasm MyLibrary.il /dll
Run Code Online (Sandbox Code Playgroud)

  • @Enrico,没有什么可以阻止您通过编程方式执行`ILDASM`和`ILASM`的相同工作……而且,您对手动过程的说明还不完整。为了拆卸,您应该添加`/ utf8 / typelist / all`,并重新组装`/ resource = MyLibrary.res`。 (2认同)

Luc*_*ero 6

是的,这是可能的,通过使用ILDASM和进行往返来ILASM替换中间的嵌入文件.

陷阱:

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