Может ли Mono.Cecil модифицировать код, уже загруженный в домен приложений? - PullRequest
9 голосов
/ 03 мая 2010

Я хочу добавить некоторое поведение к определенному классу во время выполнения. Я знаю, как создавать подклассы во время выполнения, используя Reflection.Emit, но этого недостаточно, в зависимости от некоторой внешней конфигурации мне нужно вводить коды операций в методе типа T, чтобы все классы, которые наследуют его, автоматически получали такое поведение (я не могу использовать .NET Profiling API)

Можно ли сделать что-то подобное с Mono.Cecil?

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

Ответы [ 2 ]

6 голосов
/ 03 мая 2010

Нет, Сесил не может изменить загруженную сборку.Вы должны инструментальные сборки до того, как они действительно будут загружены.

У вас нет большого контроля над разрешением сборок.Вы можете подключиться к AppDomain.AssemblyResolve, если скрываете сборки в своей личной папке, а затем инструмент до загрузки.

1 голос
/ 18 апреля 2012

Как говорит JB выше Вы можете создать обработчик события Resolve, который будет похож на PSeudoHooking. И до загрузки сборки вы вносите изменения, а затем, как только изменения сделаны, Resolve Assembly продолжает загрузку измененной сборки.

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

...