代码之家  ›  专栏  ›  技术社区  ›  Nick Whaley

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

  •  7
  • Nick Whaley  · 技术社区  · 17 年前

    我有一个嵌入了特定资源文件(名为“script.xml”)的已编译.NET程序集。我需要以编程的方式把它换成另一个。

    如果不从源代码重新编译,是否可以这样做?

    目前,我在文件中搜索我知道的文本,它工作得很好。但是我需要为另一个项目做这个,在这个项目中我不知道资源文件的任何内容,我需要找到另一个方法。

    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();
    
    4 回复  |  直到 8 年前
        1
  •  4
  •   Simon Randy Burden    15 年前

    你可以使用 Cecil 打开程序集并插入资源(我做了)。牛传染性胃肠炎病毒

        2
  •  4
  •   Jon Skeet    17 年前

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

    如果您需要可替换的资源,我会把它们放在一个完全不同的文件中,而这个文件没有一个程序集相对复杂的格式。

        3
  •  1
  •   clemahieu    17 年前

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

        4
  •  1
  •   womp    17 年前

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

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

    推荐文章