以编程方式将资源嵌入.NET程序集中

我有一个嵌入了特定资源文件的编译.NET程序集(名为’Script.xml’)。 我需要以编程方式将其更改为另一个。

如果不从源代码重新编译,这可能吗?

目前,我搜索文件中我知道的文本并且效果很好。 但我需要为另一个项目做这件事,我不知道资源文件的任何内容,我需要找到另一种方法。

FileStream exe = new FileStream(currentexe, FileMode.Open); //find xml part of exefile string find = ""; string lastchars = new string(' ', find.Length); while (exe.CanRead) { lastchars = lastchars.Substring(1) + (char)exe.ReadByte(); if (lastchars == find) { exe.Seek(-find.Length, SeekOrigin.Current); break; } } //output serialized script int bytenum = 0; foreach (byte c in xml) { if (c == 0) break; exe.WriteByte(c); bytenum++; } //clean out extra data while (bytenum++ < ScriptFileSize) { exe.WriteByte(0x20); } exe.Close(); 

您可以使用Cecil打开程序集并插入资源(我这样做)。 因人而异

您当前的机制非常脆弱 – 它不适用于已签名的程序集(因为哈希将更改)或者您需要将一个资源替换为更大的资源(因为所有其他偏移可能会移动)。 它在字符编码和在文件中找到正确点的一般机制方面也存在问题,但考虑到我认为这种方法不适合开始,这些问题相对不重要。

如果你需要可替换的资源,我会把它们放在一个不同的文件中,它没有相对精致的程序集格式。

您可能正在寻找System.Runtime.Emit来动态编译程序集。

您可以使用reflection动态构建程序集,特别是AssemblyBuilder类,并在动态构建的程序集中包含资源。 我不确定是否可以使用reflection来拆卸现有的assembly体(虽然现在我很感兴趣)。

如果可能的话,我会吠叫另一棵树。