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

问题描述 投票:0回答:4

我有一个已编译的 .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();
c# resources
4个回答
4
投票

您可以使用

Cecil
打开程序集并插入资源(我这样做)。 YMMV


4
投票

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

如果您需要可替换的资源,我会将它们完全放在不同的文件中,该文件没有程序集相对精致的格式。


1
投票

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


1
投票

您可以使用反射(特别是

AssemblyBuilder
类)动态构建程序集,并在动态构建的程序集中包含资源。 我不确定是否可以使用反射来拆卸现有程序集(尽管现在我很感兴趣)。

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

© www.soinside.com 2019 - 2024. All rights reserved.