Возможно ли добавить / удалить / изменить встроенный ресурс в .NET DLL?

19

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

Edit:

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

    
задан Mas 01.07.2011 в 11:10
источник

3 ответа

16

Невозможно сделать это в управляемом коде . Как только ресурс был встроен, он становится частью сборки, как и скомпилированный код 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
    
ответ дан Enrico Campidoglio 01.07.2011 в 11:31
источник
  • У меня возникли проблемы со встроенными лицензиями с сторонними библиотеками. Когда мы внедряем лицензию в нашу библиотеку, она зависит от конкретной версии. Я хотел иметь возможность создавать 2 версии сборки, без лицензии, с лицензией. –  Mas 01.07.2011 в 11:46
  • @ Enrico - любая причина, по которой вы можете думать, почему решение Лусеро невозможно? –  Kieren Johnstone 01.07.2011 в 11:47
  • @Kieren Я думал, что @Mas означает программно. Ручной способ, предложенный @Lucero, работает. Я добавил ссылку на его ответ и привел пример. –  Enrico Campidoglio 01.07.2011 в 13:06
  • @ Enrico, ничто не мешает вам программно делать то же самое, что и ILDASM и ILASM ... также, ваши инструкции для ручного процесса не завершены. Для дизассемблирования вы должны добавить / utf8 / typelist / all, а также для повторной сборки /resource=MyLibrary.res. –  Lucero 01.07.2011 в 14:18
  • @ Lucero Как это будет сделано программно? Я пробовал инструкции, используя пример приложения Console со встроенным текстовым файлом, и он работает. Эти инструкции предназначены только для примера. Другим сценариям понадобится другой набор аргументов. –  Enrico Campidoglio 01.07.2011 в 14:31
Показать остальные комментарии
18

Это так просто, всего 3 строки кода. Вам нужно обратиться к mono.cecil.dll (google it!) и:

var targetasmdef = AssemblyFactory.GetAssembly("My.dll");
//May seach for the one you need
targetasmdef.MainModule.Resources.RemoveAt(0);
AssemblyFactory.SaveAssembly(targetasmdef, "My2.dll");
    
ответ дан dexit2k 02.11.2011 в 10:53
источник
  • Я написал небольшую программу, которая может заменить встроенные ресурсы: github.com/qerub/ReplaceEmbeddedAssemblyResource –  qerub 12.02.2013 в 14:38
6

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

Gotchas:

  • вам нужен strong ключевой файл имени, если сборка была сильной, или вы не получите то же имя сборки в конце
  • Если сборка была подписана с сертификатом, вам нужен сертификат, включая закрытый ключ, чтобы его переписать в случае необходимости
  • obfuscated assemblysies могут не совершить кругооборот из-за проблем с именами.
ответ дан Lucero 01.07.2011 в 11:35
источник
  • Приятно, это звучит как интересное решение. Благодаря! –  Mas 01.07.2011 в 14:46
  • Еще одно предостережение: сборки смешанного режима не полностью разбираются при прокладке через ILDASM, поэтому не удается вернуться через ILASM. –  coderforlife 14.10.2014 в 02:42