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

StackOverflow https://stackoverflow.com/questions/1382922

Вопрос

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

Начну с того, что знаю (пока пробовал только PostSharp):

  • Microsoft Common Compiler Trencruture (CCI):Я читал, что используется для FXCOP, Ilmerge, Spec# и Code Contracts.Кажется это очень низкий уровень поскольку он даже не заботится об исправлении смещений для кодов ветвей, которые прерываются при изменении IL с его помощью..
  • ПостШарп 5 лет, имеет много возможностей для AOP (например,Тезисы Некоторые вещи, которые вам нужно будет делать вручную с IL OWNE), доступный исходный код, разработанный/поддержанный только одним парнем, но он планирует сделать это бизнесом, имеет документацию, но может быть лучше, построить примерно вдвое длине времени В ближайшее время будут выпущены очень мало образцов о том, как вводить IL и версию 2.0, что обещает значительно улучшить.
  • Моно Сесил:Написанный одним парнем, частью Mono Suite, и есть плагин для отражателя, который называется Refleclesil, которая использует Mono Cecil.
Это было полезно?

Решение

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

Другие советы

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

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

Я предлагаю вам взглянуть на ЛиньФу — это набор библиотек с открытым исходным кодом, одна из них — это AOP-фреймворк, реализованный поверх Mono.Cecil.Есть хорошая статья о ЛинФу АОП на КодПроекте.

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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top