Как я могу сканировать код MSIL, чтобы найти определенные вызовы функций - PullRequest
0 голосов
/ 08 февраля 2009

Я собираюсь создать графический интерфейс SOA, и я хотел бы автоматически определять службы и зависимости служб от клиентских модулей. У меня есть код, подобный этому, который работает с использованием атрибутов, размещенных на модулях класса:

[ServiceProvider(typeof(DemoService3))]
[ServiceConsumer(typeof(DemoService1))]

Мне интересно, как я могу сканировать их автоматически, чтобы люди не забыли добавить маркер и потенциально получить нулевые ссылки во время выполнения. В коде сервисы регистрируются и выбираются с помощью следующих команд:

Services.RegisterService(new DemoService1());
Services.FetchService<DemoService3>();

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

Ответы [ 3 ]

4 голосов
/ 08 февраля 2009

Вам понадобится проанализировать IL на уровне CLR, а не на уровне C #, чтобы понять это.

Вы можете использовать Mono Cecil , чтобы осуществить это.

2 голосов
/ 09 февраля 2009

Если по какой-то причине вы не можете использовать Mono.Cecil, вы можете рассмотреть разбор IL вручную: вам просто нужно найти инструкции call и callvirt, возможно, достаточно статического анализа, чтобы понять тип, возвращаемый new DemoService1().

typeof(YourClass).GetMethod("YourMethod").GetMethodBody().GetILAsByteArray() твой друг.

2 голосов
/ 08 февраля 2009

Для этого можно использовать отражение Mono.Cecil или .NET.

Mono.Cecil рекомендуется из-за его лучшей производительности и гибкости. Вот несколько примеров (Cecil + простые расширения сверху), которые могут помочь вам начать:

...