我有一个已编译的 .NET 程序集,其中嵌入了特定的资源文件(名为“Script.xml”)。我需要以编程方式将其更改为另一个。
这可以在不从源代码重新编译的情况下完成吗?
目前,我搜索文件中我知道的文本,效果很好。但我需要为另一个项目执行此操作,我不知道资源文件的任何内容,并且我需要找到另一种方法。
FileStream exe = new FileStream(currentexe, FileMode.Open);
//find xml part of exefile
string find = "<?xml version=\"1.0\"?>";
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
打开程序集并插入资源(我这样做)。 YMMV
您当前的机制非常脆弱 - 它不适用于已签名的程序集(因为哈希会发生变化),或者如果您需要用更大的资源替换一种资源(因为所有其他偏移量可能会移动)。它在字符编码和在文件中找到正确点的一般机制方面也存在问题,但考虑到我认为该方法不适合开始,这些相对不重要。
如果您需要可替换的资源,我会将它们完全放在不同的文件中,该文件没有程序集相对精致的格式。
您可能正在寻找 System.Runtime.Emit 来动态编译程序集。
您可以使用反射(特别是
AssemblyBuilder
类)动态构建程序集,并在动态构建的程序集中包含资源。 我不确定是否可以使用反射来拆卸现有程序集(尽管现在我很感兴趣)。
如果可能的话,我会树另一棵树。