Можно ли добавить / удалить / изменить встроенный ресурс в .NET DLL? - PullRequest
19 голосов
/ 01 июля 2011

Можно ли добавить / удалить / изменить встроенный ресурс в .NET DLL после его компиляции?Если да, то как это сделать, и есть ли какие-то ошибки?

Редактировать:

Я хотел бы сделать это вручную, но в конечном итоге автоматически через скрипт всобытие после сборки.

Ответы [ 3 ]

19 голосов
/ 02 ноября 2011

Это так просто, всего 3 строки кода. Что вам нужно, это ссылаться на mono.cecil.dll (Google!) и:

var targetasmdef = AssemblyFactory.GetAssembly("My.dll");
//May seach for the one you need
targetasmdef.MainModule.Resources.RemoveAt(0);
AssemblyFactory.SaveAssembly(targetasmdef, "My2.dll");
16 голосов
/ 01 июля 2011

Нет способа сделать это в управляемом коде . Когда ресурс внедрен, он становится частью сборки, как и скомпилированный код MSIL.

Однако, вы можете сделать это вручную , как , предложенный Lucero , разобрав DLL в текстовый файл с помощью ildasm , удалив ресурс с помощью текстовый редактор и, наконец, повторная сборка DLL с помощью ilasm .

Вот пример использования DLL с одним встроенным текстовым файлом:

1) Декомпилировать DLL в MSIL:

ildasm MyLibrary.dll /out=MyLibrary.il

2) Откройте полученный файл MyLibrary.il и удалите раздел .mresource:

.mresource public MyLibrary.MyResource.txt
{
  // Offset: 0x00000000 Length: 0x0000000F
  // WARNING: managed resource file MyLibrary.MyResource.txt created
}

3) Соберите DLL из измененного MyLibrary.il файла:

ilasm MyLibrary.il /dll
6 голосов
/ 01 июля 2011

Да, это возможно, выполнив туда-обратно с ILDASM и ILASM, заменив встроенные файлы между ними.

Получено:

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