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

17

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

Edit:

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

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

3 ответа

15

Невозможно сделать это в управляемом коде . Как только ресурс был встроен, он становится частью сборки, как и скомпилированный код 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
источник
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
источник
6

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

Gotchas:

  • вам нужен strong ключевой файл имени, если сборка была сильной, или вы не получите то же имя сборки в конце
  • Если сборка была подписана с сертификатом, вам нужен сертификат, включая закрытый ключ, чтобы его переписать в случае необходимости
  • obfuscated assemblysies могут не совершить кругооборот из-за проблем с именами.
ответ дан Lucero 01.07.2011 в 11:35
источник