سؤال

ما هو الأفضل من حيث القدرات ، وسهولة الاستخدام ، والتوثيق ، والعينات ، والمجتمع/الدعم ، والتكامل ، والتطبيقات المعروفة ، والقدرة على المدى الطويل ، وسرعة بناء لتنفيذ إطار AOP مخصص؟

سأبدأ بما أعرفه (لقد حاولت فقط postsharp حتى الآن):

  • Microsoft Common Compiler Instracture (CCI): لقد قرأت ذلك المستخدم في عقود FXCOP و Ilmerge و Spec# و Code. يبدو أنه مستوى منخفض للغاية نظرًا لأنه لا يهتم حتى بتصحيح التعويضات للرموز الفرعية التي يتم تعديلها عند تعديل IL معها.
  • postsharp يبلغ من العمر 5 سنوات ، ولديه العديد من القدرات لـ AOP (على سبيل المثال ، بعض الأشياء التي تحتاج إلى القيام بها يدويًا مع IL بعيدًا) ، رمز المصدر المتاح ، تم تطويره/دعمه من قبل شخص واحد ، لكنه يخطط لجعل هذا العمل ، لديه عمل ، الوثائق ولكن يمكن أن تكون أفضل ، فستستغرق التصميمات حوالي ضعف عينات قليلة جدًا حول كيفية حقن IL وإصدار الإصدار 2.0 قريبًا ، مما يعد بتحسينه كثيرًا.
  • مونو سيسيل: كتبه رجل واحد ، جزء من جناح Mono وهناك مكون إضافي للعاكس يسمى Reflexil الذي يستخدم Mono Cecil.
هل كانت مفيدة؟

المحلول

كل من Microsoft.cci و Mono.ceC هي منخفضة المستوى ، ولا تتحقق من التجميعات المنتجة. يستغرق الأمر الكثير من الوقت للعثور على سبب المشكلة ، إذا كان هناك أي خطأ في هيكل التعليمات البرمجية أو التجميع.
أوصي باستخدام PostSharp إذا كانت الميزات كافية لك المهام.
خلاف ذلك ... Mono.cecil لديه أفضل وأكثر فهمًا وسهولة في استخدام نموذج الكائن. ومع ذلك ، كان لدي خطأ قبيح عند استخدامه في برنامجي (تم حفظ الإشارة إلى الطريقة الخاطئة في التجميع ؛ أعتقد أنه كان هناك بعض الأخطاء مع معالجة الرموز الوصفية)
لدى Microsoft.cci نموذج كائن قبيح مصمم تمامًا في نفس الوقت الذي يفتقر إلى العديد من الميزات البسيطة ؛ ومع ذلك ، فهو أكثر نضجا من mono.cecil. أخيرًا ، تخلت عن mono.cecil واستخدمت microsoft.cci لبرنامجي.

نصائح أخرى

كما هو الحال مع معظم الأطر الموجودة بالفعل ، أود أن أقترح عليك ، فيما يتعلق بتنفيذ إطار عمل AOP الخاص بك: لا تفعل ذلك. هناك العديد من الأشياء الموجودة بالفعل ، بما في ذلك (ستصبح قريبًا) Postsharp المدعومة تجاريًا ، و cthru, ، إطار AOP مدعوم من قبل Typemock.

ولكن على أي حال ، لقد وجدت mono.cecil من السهل الاستخدام للغاية. يملأ الحاجة إلى التعامل معها Reflection.Emit بشكل جيد ، ولديه دعم مجتمع أحادي.

أقترح أن تكون قد ألقيت نظرة على لينفو - إنها مجموعة مفتوحة المصدر من المكتبات ، إحداها هي إطار عمل 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.

لذا ، عد إلى سؤالك ، وبالطبع مع بيايس الخاصة بي ، أود أن أقول: إذا كنت ترغب في كتابة محامل ، اندماج/انكماش ، وهكذا ترخيص إذا كان أكثر ودية من PostSharp. ولكن إذا كنت ترغب فقط في تطوير جانب مخصص ، فإن استخدام PostSharp سيجعلك حفظ أسابيع, ، وستفاجأ بالظروف التجارية التي يمكننا تقديمها إذا كنت تخطط لإعادة توزيع PostSharp.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top