Практические применения MethodRental Class? - PullRequest
12 голосов
/ 17 мая 2010

Согласно MSDN MethodRental Class позволяет изменить тело метода динамических модулей. Однако из-за его ограничений я не могу думать о практических способах его использования. Гугл мне тоже не помог.

Есть идеи, для чего этот класс можно использовать?

Ответы [ 2 ]

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

По духу это похоже на ICorProfilerCallback::JITCompilationStarted в паре с ICorProfilerInfo::SetILFunctionBody, но с большим количеством ограничений. Классы ICorProfiler* могут использоваться для выполнения инструментария во время выполнения практически для любого управляемого метода. Существуют профилировщики и отладчики, которые используют их для сбора информации о запущенном процессе.

Вы можете использовать MethodRental для кодирования прибора в диагностических целях. Некоторые примеры:

  • Функция enter / exit даст вам трассировку выполнения, которую вы можете использовать для получения данных профилирования.
  • Инструментарий синхронизации примитивов может помочь вам диагностировать условия гонки.
  • Инструментирование основных блоков может помочь вам определить покрытие кода.

Вы также можете использовать MethodRental для улучшения функциональности существующего кода. Аспектно-ориентированное программирование приходит на ум. Вы можете «вплетать» в безопасность, ведение журналов или другие сквозные проблемы проектирования в существующий код. Однако для выражения ваших аспектов потребуются некоторые другие средства (XML, библиотека C #).

Наконец, вы можете использовать MethodRental для обхода существующего кода, т.е. перехватывать вызовы методов для создания своего рода полиморфизма во время выполнения. Например, если у вас есть клиентский код, который использует некоторый динамически сгенерированный класс RegistryStore, чтобы получить некоторую конфигурацию через GetConfig, вы можете переписать IL метода, чтобы изменить реализацию RegistryStore.GetConfig для использования файловой системы. Вы можете сделать это без изменения кода клиента.

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

Не уверен, какие ограничения вы имеете в виду. Очевидно, что это может работать только с динамически генерируемыми методами, созданными MethodBuilder. Методы класса, которые были JIT скомпилированы из IL, загруженного из сборки, не могут быть заменены.

Вариант использования: реализация среды выполнения для динамического языка, который поддерживает изменение методов уже определенных классов (исправление обезьян). Такие языки, как Ruby, Python, Javascript и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...