Динамический перехват вызовов в .NET - PullRequest
8 голосов
/ 26 августа 2009

Мне интересно узнать, поддерживает ли .NET какую-либо форму динамического перехвата вызовов методов (или вызовов свойств) во время выполнения. То есть вы можете перехватить вызов объекта без статической информации компиляции, такой как интерфейс (по аналогии с CORBA DII ( текст ссылки ) или COM IDispatch).

Если нет, поможет ли в этом отношении новая функция «Динамически типизированные объекты» в C # 4.0.

Ответы [ 3 ]

17 голосов
/ 26 августа 2009

Нет ничего встроенного, что позволяет вам перехватывать объект, экземпляром которого вы не можете управлять. Точно так же не будет новых возможностей для этого в предстоящем .net 4.0.

Если вы можете управлять созданием экземпляра:

  1. Если ваш объект может быть MarshalByRef, вы можете использовать RealProxy .
  2. Вы можете использовать довольно много контейнеров IOC, например. LinFu , Castle Dynamic Proxy
  3. Вы можете использовать такой инструмент, как PostSharp , Mono Cecil или Microsoft CCI , чтобы переписать ваши сборки с перехватами в качестве шага после компиляции.

Если вы не можете управлять созданием экземпляра

  1. Вы можете использовать ICorDebug - API отладки .Net, которые действительно сложны в использовании и тяжелы.
  2. Вы можете использовать ICorProfiler - API профилирования .Net, которые также довольно сложны в использовании.

В качестве альтернативы, вы можете взглянуть на динамический язык, такой как IronRuby, который имеет встроенную alias_method и define_method доброту (которая позволяет вам переопределить все что угодно), так что перехват запекается.


.NET 4.5 представляет метод для ReJIT методов, который предоставляет еще один хук для перехвата метода (при условии, что вы не запускаете параллельный / bg GC и метод не встроен)

2 голосов
/ 26 августа 2009
1 голос
/ 25 января 2010

Проверьте .net 4.0 динамические объекты ... Это можно сделать.

http://www.ontheblog.net/CMS/Home/tabid/36/EntryID/77/Default.aspx

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