سؤال

لدي قائمة تضم حوالي 25 نوعًا موجودًا في Microsoft .NET Assembly Mscorlib.dll حيث أحتاج إلى استخراج توقيعات IL للفئة وأعضائها. أريد ملفًا واحدًا لكل نوع ، مع كل توقيع على سطر واحد. لذلك ، على سبيل المثال ، خذ النوع

System.Collections.Generic.Comparer<T>

أرغب في استخراج ما يلي من التجميع لهذا النوع (هناك بعض الأعضاء الخاصين الذين لن أحتاجهم ، لكن يمكنني التعامل مع ذلك يدويًا إذا لزم الأمر).

.class public abstract auto ansi serializable beforefieldinit System.Collections.Generic.Comparer`1<T> extends System.Object implements System.Collections.IComparer, class System.Collections.Generic.IComparer`1<!T>
.method family hidebysig specialname rtspecialname instance void  .ctor() cil managed
.method public hidebysig newslot abstract virtual instance int32  Compare(!T x, !T y) cil managed
.method private hidebysig newslot virtual final instance int32  System.Collections.IComparer.Compare(object x, object y) cil managed
.property class System.Collections.Generic.Comparer`1<!T> Default() { .get class System.Collections.Generic.Comparer`1<!T> System.Collections.Generic.Comparer`1::get_Default() }

لذلك ، فكرت في أربع طرق لإنجاز هذا:

  • قم بقص ولصق كل توقيع من كل نوع باليد في الملفات النصية من ildasm (إما مباشرة أو عبر تفريغ mscorlib.dll). بعض الأنواع طويلة جدًا ، لذلك قد يصبح هذا مملاً. وهذا بالتأكيد ليس حلًا جيدًا على المدى الطويل إذا كنت بحاجة إلى بذل المزيد من الجهد.

  • اكتب أداة تستخدم الانعكاس لمحاولة الحصول على جميع التوقيعات. لقد فكرت ، على مستوى عالٍ ، في استخدام شيء مثل رمز psuedo [1] أدناه.

  • اكتب أداة تستخدم تحليل السلسلة على تفريغ IL من ildasm للعثور على الأنواع والحصول على التوقيعات

  • استخدم أداة موجودة بالفعل لإنجاز المهمة.

هل يعرف أي شخص أداة أو آلية موجودة قد تساعدني في إنجاز مهمتي؟ إذا لم يكن الأمر كذلك ، أي اقتراحات حول أي اتجاه للذهاب للحصول على مثل هذه الأداة؟ وإذا كان لديك أي أفكار رمز حول كيفية القيام بذلك ، فسأقدر سماعها.

[1]

System.Reflection.GetType(string)
Type.GetMethods() For each item in
MethodInfo, GetMethodBody()
GetILAsByteArray().ToString()
Determine a way to get just the signature from the IL
هل كانت مفيدة؟

المحلول

Red Gate Reflector يمكن أن تجعل القطع واللصق يذهب أسرع بكثير.

نصائح أخرى

يمكنك إعادة بناء توقيع الطريقة من المعلومات الموجودة في MethodInfo. لا تحتاج إلى getMethodbody - لا توجد معلومات توقيع هناك. MemberInfo.name ، MemberInfo.returntype ، MemberInfo.getParameters () ، إلخ. كل شيء هناك.

إذا قررت الحصول على التوقيع من IL ، فستحتاج إلى كتابة نوع من محلل التوقيع. ديفيد برومان لديه عينة واحدة تم نشرها في معرض MSDN Code هنا. إنه ليس يعمل بشكل كامل (على وجه التحديد ، سيتعين عليك إضافة دعم للأشكال العامة) ، ولكنه يمنحك بداية الرأس.

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