Программно встраивать ресурсы в сборку .NET - PullRequest
7 голосов
/ 10 июля 2009

У меня есть скомпилированная сборка .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();

Ответы [ 4 ]

4 голосов
/ 10 июля 2009

Вы можете использовать Cecil, чтобы открыть сборку и вставить ресурс (я так делаю). YMMV

4 голосов
/ 10 июля 2009

Ваш текущий механизм очень хрупок - он не будет работать для подписанных сборок (так как хеш изменится) или если вам нужно заменить один ресурс на больший (так как все другие смещения могут перемещаться). У него также есть проблемы с точки зрения кодировки символов и общего механизма, позволяющего найти правильную точку в файле, в любом случае, но они относительно не важны, учитывая, что я не думаю, что подход подходит для начала.

Если вам нужны сменные ресурсы, я бы вообще поместил их в другой файл, который не имеет относительно деликатного формата сборки.

1 голос
/ 10 июля 2009

Вы можете динамически создавать сборки, используя отражение, в частности класс AssemblyBuilder, и включать ресурсы в динамически создаваемую сборку. Я не уверен, что можно разобрать существующую сборку, используя отражение (хотя сейчас мне это интересно).

Я бы покорил другое дерево, если это возможно.

1 голос
/ 10 июля 2009

Возможно, вы ищете System.Runtime.Emit для динамической компиляции сборки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...