Подтвердить что ты не робот

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

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

Edit:

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

4b9b3361

Ответ 1

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

Ответ 2

Это так просто, всего 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");

Ответ 3

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

Gotchas:

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