Согласно MSDN MethodRental Class позволяет изменять тело метода динамических модулей. Однако из-за его ограничений я не могу придумать практические способы его использования. Google тоже не помог мне.
Любые идеи, для чего можно использовать класс?
Согласно MSDN MethodRental Class позволяет изменять тело метода динамических модулей. Однако из-за его ограничений я не могу придумать практические способы его использования. Google тоже не помог мне.
Любые идеи, для чего можно использовать класс?
Это похоже по духу на ICorProfilerCallback::JITCompilationStarted
в паре с ICorProfilerInfo::SetILFunctionBody
, но с большим количеством ограничений. Классы ICorProfiler*
могут использоваться для выполнения инструментария во время выполнения практически для любого управляемого метода. Существуют профилировщики и отладчики, которые используют их для сбора информации о текущем процессе.
Вы можете использовать MethodRental
для кода инструмента для диагностики. Некоторые примеры:
Вы также можете использовать MethodRental
для улучшения функциональности существующего кода. Аспектно-ориентированное программирование. Вы можете "переплетать" безопасность, протоколирование или другие сквозные проблемы проектирования в существующий код. Однако для выражения ваших аспектов потребуется другое средство (XML, библиотека С#).
Наконец, вы можете использовать MethodRental
для "обхода" существующего кода, т.е. вызовов метода перехвата, чтобы создать своего рода полиморфизм во время выполнения. Например, если у вас есть клиентский код, который использует некоторый динамически сгенерированный класс RegistryStore
для получения некоторой конфигурации через GetConfig
, вы можете переписать метод IL, чтобы изменить реализацию RegistryStore.GetConfig
, чтобы вместо этого использовать файловую систему. Вы можете сделать это без изменения кода клиента.
Не знаете, какие ограничения вы имеете в виду. Очевидно, что это может работать только на динамически генерируемые методы, созданные MethodBuilder. Методы класса, которые были JIT, скомпилированные из IL, загруженные из сборки, не могут быть заменены.
Вариант использования будет реализовывать среду выполнения для динамического языка, который поддерживает изменение методов уже определенных классов (переключение обезьян). Языки, такие как Ruby, Python, Javascript и т.д.