Вопрос

Есть ли способ изменить существующие сборки .NET, не прибегая к сторонним инструментам?я знаю это ПостШарп делает это возможным, но я считаю невероятно расточительным то, что разработчику PostSharp фактически пришлось переписывать функциональность всего System.Reflection пространство имен, чтобы сделать существующие сборки доступными для изменения.

System.Reflection.Emit позволяет создавать только новые динамические сборки.Однако все используемые здесь классы-строители наследуют от базовых классов отражения (например, TypeBuilder наследует от System.Type).К сожалению, похоже, не существует способа принудительного использования существующего динамически загружаемого типа в построителе типов.По крайней мере, официального, поддерживаемого способа нет.

А что насчет неподдерживаемого?Кто-нибудь знает бэкдоры, позволяющие загружать существующие сборки или типы в такие классы-построители?

Ум, я нет поиск способов модификации текущей сборки (это может пусть даже необоснованная просьба), а всего лишь модифицировать существующие сборки, загруженные с диска.Боюсь, такого не существует, но все равно хотелось бы спросить.

В худшем случае придется прибегнуть к ildasm.exe дизассемблировать код, а затем ilasm.exe для повторной сборки, но нет набора инструментов (читай:IL-ридер), содержащийся в .NET для работы с IL-данными (или есть?).

/РЕДАКТИРОВАТЬ:

У меня нет конкретного варианта использования.Меня просто интересует универсальное решение, поскольку исправление существующих сборок — довольно распространенная задача.Возьмем, к примеру, обфускаторы, или профилировщики, или библиотеки АОП (да, последние может реализовать по-другому).Как я уже сказал, кажется невероятно расточительным переписывать большую часть уже существующей инфраструктуры в System.Reflection.


@Клин:

Ты прав.Однако здесь нет конкретного варианта использования.Я изменил исходный вопрос, чтобы отразить это.Мой интерес был вызван еще одним вопросом, задавший вопрос, как можно внедрить инструкции. pop и ret в конце каждого метода, чтобы предотвратить реинжиниринг исходного кода (VB или C#) с помощью Reflector Лутца Рёдера.

Теперь этот сценарий можно реализовать с помощью ряда инструментов, например.PostSharp, упомянутый выше, и Рефлексил плагин для Reflector, который, в свою очередь, использует Сесил библиотека.

В общем, меня просто не устраивает платформа .NET.

@Джоэл:

Да, я знаю об этом ограничении.В любом случае спасибо за указание на это, поскольку это важно.

@marxidad:

Кажется, это единственный возможный подход.Однако это будет означать, что вам все равно придется заново создавать полную сборку, используя классы-строители, верно?Т.е.вам придется пройти всю сборку вручную.

Хм, я посмотрю на это.

Это было полезно?

Решение

Вы можете использовать MethodInfo.GetMethodBody().GetILasByteArray(), измените это, а затем подключите обратно к MethodBuilder.CreateMethodBody().

Другие советы

Mono.Cecil также позволяет удалить строгое имя из данной сборки и сохранить ее обратно как неподписанную сборку.Удалив строгое имя из сборки, вы можете просто изменить IL-код вашего целевого метода и использовать сборку, как и любую другую сборку.Вот ссылка для удаления сильного имени с Сесилом:

http://groups.google.com/group/mono-cecil/browse_thread/thread/3cc4ac0038c99380/b8ee62b03b56715d?lnk=gst&q=strong+named#b8ee62b03b56715d

Удалив строгое имя, вы можете делать со сборкой все, что захотите.Наслаждаться!

Было бы полезно, если бы вы предоставили более конкретный вариант использования, возможно, есть лучшие способы решить вашу проблему, чем этот.

В .NET 3.5 можно добавлять методы расширения к существующим классам фреймворка, возможно, этого достаточно?

Один важный момент:если сборка подписано, любые изменения потерпят неудачу, и вы получите ошибку.

Сборки .NET Framework подписаны, и, как сказал Джоэл Коегоорн, вы получите подделку.

Вы можете загрузить сборку с помощью IronRuby и использовать все функции, о которых только можете мечтать.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top