Возможно ли добавить/удалить/изменить встроенный ресурс в .NET DLL?
Можно ли добавить/удалить/изменить встроенный ресурс в .NET DLL после его компиляции? Если да, то как это делается, и есть ли какие-либо ошибки?
Edit:
Я хотел бы сделать это вручную, но автоматически автоматически через script в событии после сборки.
Ответы
Ответ 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 могут не совершить кругооборот из-за проблем с именами.