Моно Сесил против Core PostSharp против Microsoft CCI для реализации инфраструктуры AOP

Что лучше с точки зрения возможностей, простоты использования, документации, образцов, сообщества/поддержки, интеграции VS, известных реализаций, долговременной жизнеспособности и скорости сборки для реализации пользовательской инфраструктуры AOP?

Я начну с того, что знаю (я только пробовал PostSharp до сих пор):

  • Общий компилятор Microsoft Instrastruture (CCI): я читал, что используется для FxCop, ILMerge, SpeС# и Кодовые контракты. Это, кажется, очень низкий уровень поскольку он даже не заботится об исправлении смещений для кодов ветвей, которые являются borken, когда IL изменен с ним.
  • PostSharp - 5 лет, много возможности для АОП (например, тезисы некоторые вещи, которые вам нужно будет делать вручную с ИЛ), источник доступный код, разработанный/поддерживаемый только одним парнем, но он планирует делая это но может быть лучше, сборки занимают примерно вдвое больше, очень маленькие образцы о том, как вводить IL и версия 2.0 будет выпущена в ближайшее время который promises будет значительно улучшен.
  • Моно Сесил: написано одним парнем, часть из сюиты Mono, и есть плагин для рефлектора под названием Reflexil который использует Mono Cecil.

Ответы

Ответ 1

Оба Microsoft.CCI и Mono.Cecil являются низкоуровневыми и не проверяют произведенные сборки. Требуется много времени, чтобы найти причину проблемы, если есть какая-либо ошибка в сгенерированной структуре кода или сборки.
Я бы рекомендовал использовать PostSharp, если этого достаточно для выполнения задач.
В противном случае... Mono.Cecil имеет лучшую, понятную и удобную в использовании объектную модель. Тем не менее, у меня была уродливая ошибка при ее использовании в моей программе (ссылка на неправильный метод была сохранена в сборке, я думаю, что была ошибка с обработкой токенов метаданных)
У Microsoft.CCI есть уродливая, полностью переработанная объектная модель, в то же время отсутствует много простых функций; однако он более зрелый, чем Mono.Cecil. Наконец, я отказался от Mono.Cecil и использовал Microsoft.CCI для своей программы.

Ответ 2

Как и в большинстве инфраструктур, которые уже существуют, я хотел бы предложить вам, в отношении реализации вашей собственной инфраструктуры AOP: Не делать этого. Есть несколько уже существующих, в том числе (скоро будет) коммерчески поддерживаемых PostSharp и CThru, инфраструктура AOP, работающая от Typemock.

Но в любом случае, я нашел Mono.Cecil очень простым в использовании. Он абстрагирует необходимость иметь дело с Reflection.Emit красиво, и он поддерживает сообщество Mono.

Я предлагаю вам взглянуть на LinFu - это набор библиотек с открытым исходным кодом, один из которых представляет собой структуру AOP реализованный поверх Mono.Cecil. В CodeProject есть хорошая статья о LinFu AOP.

Ответ 3

AFAIK, LinFu построен на Mono.Cecil.

Я бы сказал, что PostSharp.Core имеет более высокоуровневые функции, чем другие фреймворки, поэтому он менее сложно использовать для больших работ. Вы можете работать и на низком уровне, но не на двоичном уровне (по дизайну). Вы можете выполнить слияние/сжимание сборки с помощью PostSharp, но тот факт, что он компилируется с использованием ILASM, установит некоторые ограничения (например, чтобы назвать даже внутренние члены). С другой стороны, наличие ILASM в качестве бэкэнд значительно упрощает разработку на вершине PostSharp, поскольку ILASM проверяет множество правил, и вы можете легко прочитать полученный код MSIL. PostSharp даже позволяет помещать комментарии в MSIL, чтобы помочь отлаживать генерации кода.

Еще один момент: если вы хотите сделать индивидуальный аспект (например, вы разрабатываете механизм базы данных и хотите предоставить аспект персистентности), вам нужно гораздо больше, чем просто переписывающий MSIL. Вам нужна инфраструктура АО, которая будет выполнять большую часть работы за вас. Когда вы разрабатываете индивидуальный аспект, я бы сказал, что 1% работы зависит от вашего пользовательского аспекта, 39% - это инфраструктура аспекта, а 60% - материал перезаписи MSIL. Я часто могу запрограммировать очень конкретный аспект через пару часов на основе PostSharp.

Итак, вернемся к вашему вопросу и, конечно же, со своей собственной биаи, я бы сказал: если вы хотите написать обфускатор, слияние/сжимание и т.д., скорее перейдите на Mono.Cecil или Microsoft.CCI для единственного причина в том, что их лицензия более дружелюбна, чем PostSharp. Но если вы просто хотите разработать индивидуальный аспект, использование PostSharp позволит вам сохранить недели, и вы будете удивлены коммерческими условиями, которые мы можем предложить, если вы планируете перераспределять PostSharp.