Моно Сесил против 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.