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