Есть ли способ изменить существующие сборки .NET, не прибегая к сторонним инструментам? Я знаю, что PostSharp делает это возможным, но я нахожу невероятно расточительным, что разработчик PostSharp в основном должен был переписать функциональность всего пространства имен System.Reflection
, чтобы сделать существующие сборки модифицируемыми.
System.Reflection.Emit
позволяет создавать только новые динамические сборки. Однако все используемые здесь классы построителей наследуются от базовых классов отражений (например, TypeBuilder
наследуется от System.Type
). К сожалению, кажется, нет способа принудительно привести существующий, динамически загружаемый тип в конструктор типов. По крайней мере, нет официального, поддерживаемого способа.
Так как насчет неподдерживаемых? Кто-нибудь знает о бэкдорах, которые позволяют загружать существующие сборки или типы в такие классы компоновщиков?
Имейте в виду, я не ищу способы изменить текущую сборку (этот может даже быть необоснованным запросом), а просто изменяет существующие сборки, загруженные с диска. Боюсь, что такого нет, но я все равно хотел бы спросить.
В худшем случае для дизассемблирования кода придется прибегнуть к ildasm.exe
, а для повторной сборки - к ilasm.exe
, но в .NET отсутствует набор инструментов (читай: IL reader) для работы с данными IL (или есть?).
/ EDIT:
У меня нет конкретного случая использования. Я просто заинтересован в решении общего назначения, потому что исправление существующих сборок - довольно распространенная задача. Возьмите, например, обфускаторы, или профилировщики, или библиотеки AOP (да, последние могут быть реализованы по-другому). Как я уже сказал, кажется невероятно расточительным переписывать большие части уже существующей инфраструктуры в System.Reflection
.
@ Клин:
Ты прав. Однако здесь нет конкретного варианта использования. Я изменил исходный вопрос, чтобы отразить это. Меня заинтересовал еще один вопрос, когда спрашивающий хотел узнать, как он может вводить инструкции pop
и ret
в конце каждого метода, чтобы не допустить реинжиниринга исходного кода Лутца Родера (VB или C #).
Теперь этот сценарий может быть реализован с помощью ряда инструментов, например, PostSharp, упомянутый выше, и плагин Reflexil для Reflector, который, в свою очередь, использует библиотеку Cecil .
В общем, я просто не удовлетворен .NET Framework.
@ Joel:
Да, я знаю об этом ограничении. В любом случае, спасибо за указание на это, так как это важно.
@ marxidad:
Это кажется единственно возможным подходом. Однако это будет означать, что вам все равно придется воссоздавать полную сборку, используя классы компоновщика, верно? То есть вам придется пройтись по всей сборке вручную.
Хм, я посмотрю на это.