Run-time injection - как изменить поведение чужого класса?
От: Albeoris  
Дата: 26.01.14 07:47
Оценка:
Доброго времени суток!

Есть программа, которая использует набор библиотек, написанных на C#.
Очень хочется внести изменения в эти библиотеки, так, чтобы некоторые классы и их методы вели себя иначе.
Библиотеки не обфусцированы, однако скомпилированы под .NET2.0 и содержат много созданного компилятором кода. Их пересоздание — весьма нетривиальный процесс из-за ограничений студии, ругающейся на левые имена и недостижимые метки.

Используя .NET Reflector и плагин Reflexil, я воткнул код, динамически загружающий мою библиотеку.
Вопрос — как теперь внести изменения в типы и методы оригинала?

Если бы методы класса были по-умолчанию виртуальными, я бы просто отнаследовался от интересующего меня класса и переопределил его, после чего заменил бы значение в нужных полях с помощью отражения. К сожалению, это не так.
Была идея вынести все публичные элементы за интерфейс, но я не знаю как в run-time изменить уже загруженный тип, навесить на него интерфейс, и изменить типы существующих полей на этот интерфейс.
Опять же, непонятно — как изменить статичные классы и их методы.

Подскажите, как такое можно провернуть.
Если ничего не получится, придётся всё-таки расковыривать библиотеки. На этот слуйчай, может, кто-нибудь подскажет что-нибудь кроме .NET Reflector и dotPeek для декомпиляции? Или надстройки к ним, позволяющие избавиться от $, >, < в именах?..
"Хаос всегда побеждает порядок, поскольку лучше организован." (с) Терри Пратчетт
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.