Моно Сесил против PostSharp Core против Microsoft CCI за реализацию AOP Framework
Что лучше с точки зрения возможностей, простоты использования, документации, примеров, сообщества / поддержки, интеграции VS, известных реализаций, долгосрочной жизнеспособности и скорости сборки для реализации пользовательской инфраструктуры AOP?
Я начну с того, что знаю (до сих пор я пробовал только PostSharp):
- Microsoft Common Compiler Instrastruture (CCI): я читал, что он используется для контрактов FxCop, ILMerge, SpeC# и Code. Кажется, что это очень низкий уровень, так как он даже не заботится о корректировке смещений для кодов ветвления, которые создаются при модификации IL с ним.
- PostSharp 5 лет, он имеет много возможностей для AOP (например, абстрагирует некоторые вещи, которые вам нужно было бы сделать вручную без IL), имеется исходный код, разработанный / поддерживаемый только одним парнем, но он планирует сделать это бизнесом, имеет документацию, но может быть и лучше, сборка занимает в два раза больше времени, очень мало примеров того, как вводить IL, и скоро будет выпущена версия 2.0, которая обещает быть значительно улучшена.
- Mono Cecil: написано одним парнем, входящим в комплект Mono, и есть плагин для Reflector под названием Reflexil, который использует Mono Cecil.
3 ответа
И Microsoft.CCI, и Mono.Cecil являются низкоуровневыми и не проверяют произведенные сборки. Требуется много времени, чтобы найти причину проблемы, если есть какая-либо ошибка в сгенерированном коде или структуре сборки.
Я бы порекомендовал использовать PostSharp, если его возможностей достаточно для ваших задач.
В противном случае... Mono.Cecil имеет лучшую, более понятную и простую в использовании объектную модель. Однако у меня была ужасная ошибка, когда я использовал ее в своей программе (ссылка на неправильный метод была сохранена в сборке; я думаю, что была некоторая ошибка с обработкой токенов метаданных)
Microsoft.CCI имеет уродливую, чрезмерно спроектированную объектную модель, в то же время лишенную множества простых функций; однако, он более зрелый, чем Mono.Cecil. Наконец, я отказался от Mono.Cecil и использовал Microsoft.CCI для своей программы.
Как и в случае с большинством фреймворков, которые уже существуют, я бы посоветовал вам относительно реализации вашей собственной фреймворка AOP: не делайте этого. Уже есть несколько, включая (в ближайшее время) коммерчески поддерживаемую PostSharp и CThru, AOP-фреймворк, работающий на Typemock.
Но в любом случае я нашел Mono.Cecil очень простым в использовании. Это избавляет от необходимости иметь дело с Reflection.Emit
хорошо, и это имеет поддержку сообщества Mono.
Я предлагаю вам взглянуть на LinFu - это набор библиотек с открытым исходным кодом, одна из которых - инфраструктура AOP, реализованная поверх Mono.Cecil. Есть хорошая статья о LinFu AOP на CodeProject.
AFAIK, LinFu построен на Mono.Cecil.
Я бы сказал, что PostSharp.Core имеет больше высокоуровневых функций, чем другие фреймворки, поэтому его проще использовать для больших работ. Вы также можете работать на низком уровне, но не на бинарном уровне (по замыслу). Вы можете выполнить сборку / сжатие с использованием PostSharp, но тот факт, что она компилируется обратно с использованием ILASM, установит некоторые ограничения (например, должны быть названы даже внутренние элементы). С другой стороны, наличие ILASM в качестве бэкэнда значительно облегчает разработку на вершине PostSharp, поскольку ILASM проверяет множество правил, и вы можете легко прочитать созданный код MSIL. PostSharp даже позволяет добавлять комментарии в MSIL, чтобы помочь отладке генерации кода.
Еще один момент: если вы хотите сделать пользовательский аспект (например, вы разрабатываете движок базы данных и хотите предоставить аспект персистентности), вам нужно гораздо больше, чем просто переписчик MSIL. Вам нужна инфраструктура AO, которая сделает большую часть работы за вас. Когда вы разрабатываете пользовательский аспект, я бы сказал, что 1% работы относится к вашему пользовательскому аспекту, 39% - это инфраструктура аспектов, а 60% - это материал для переписывания MSIL. Я часто могу запрограммировать очень специфический аспект за пару часов на основе PostSharp.
Итак, вернемся к вашему вопросу и, конечно же, с моим собственным уклоном. Я бы сказал: если вы хотите написать обфускатор, слияние / усадку и т. Д., Лучше перейдите на Mono.Cecil или Microsoft.CCI по той единственной причине, что их Лицензия, если она более дружелюбная, чем у PostSharp. Но если вы просто хотите разработать собственный аспект, использование PostSharp сэкономит вам несколько недель, и вы будете удивлены коммерческими условиями, которые мы могли бы предложить, если вы планируете распространять PostSharp.