2010-05-17 3 views
12

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

Любые идеи, для чего можно использовать класс?

ответ

6

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

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

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

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

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

+0

Вы не можете использовать MethodRental для АОП, поскольку он поддерживает только динамические методы, не так ли? – Giorgi

+1

@Giorgi: Извините, я не собирался вводить в заблуждение. Вы можете использовать его для АОП, но у вас все еще будут те же ограничения, что и метод MethodRental: в частности, вы можете использовать его только в динамических методах/сборках. В зависимости от того, что вы пытаетесь сделать, это может быть совсем не полезно. Тем не менее, все перечисленные мной функции имеют такое же основное ограничение. –

+0

Спасибо за ваш ответ. Поскольку ограничение очень ограничено, потому что я не мог думать о возможном использовании. – Giorgi

6

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

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

Смежные вопросы