System.Seference - الأساليب العالمية غير متوفرة للتفكير

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

  •  01-10-2019
  •  | 
  •  

سؤال

System.Sflection لا (AFAIK) دعم الانعكاس على الأساليب العالمية في التجمع. على مستوى التجميع ، يجب أن أبدأ بأنواع الجذر.

يمكن للمترجم الخاص بي إنتاج مجموعات ذات أساليب عالمية ، كما أن LIB Bootstrap LIB هو DLL يتضمن بعض الطرق العالمية. يستخدم برنامج التحويل البرمجي الخاص بي النظام. يبدو أنني إذا كنت أعتمد على النظام. التأمل ، الأساليب العالمية ليست احتمالًا. إن أنظف الحل هو تحويل جميع الأساليب القياسية إلى الأساليب الثابتة ، ولكن النقطة هي أن لغتي تتيح الأساليب العالمية ، ودعمها CLR ، ولكن system.replection يترك فجوة.

يُظهر ILDASM الأساليب العالمية على ما يرام ، لكنني أفترض أنه لا يستخدم نظامًا. التأمل نفسه ويذهب مباشرة إلى البيانات الوصفية و BYTECODE.

إلى جانب System.Seference ، هل أي شخص يدرك أي انعكاس آخر في الطرف الثالث أو libs التفكيك الذي يمكنني الاستفادة منه (على افتراض أنني سأطلق في النهاية أن برنامج التحويل البرمجي الخاص بي هو المصدر المفتوح المرخص لـ BSD).

حل: لا توجد فجوة ، إلا في معرفتي. شكرا لإشارة getModules ، الرجال!

هل كانت مفيدة؟

المحلول

هل نظرت إلى Module.GetMethods?

إرجاع الأساليب العالمية المحددة على الوحدة النمطية

يمكنك الحصول على جميع وحدات التجميع الخاصة بك باستخدام Assembly.GetModules().

نصائح أخرى

يمكنك الاستمرار في الضرب على فجوة بين CLR و System.Seflection ، ولكن في الواقع ، لا يوجد شيء مثل طريقة عالمية أو مجال عالمي.

إنها مجرد طرق ثابتة تقليدية وحقول ثابتة يتم تعريفها في نوع معين ، مسماة <Module>, ، والتي يجب أن تكون موجودة في كل مجموعة صالحة.

كما قال جون ، يمكنك استخدام Module.GetMethod و Module.GetField للمشغل على أعضاء النوع.

إذا كنت تريد المزيد من التحكم ، يمكنك فقط الاستخدام mono.cecil.

لاحظ أن Module.GetMethod() بدون معلمات لن تُرجع جميع طرق الوحدة النمطية.
استخدم getMethods (BindingFlags) بدلاً من ذلك.

مثال C ++/CLI:

#using <System.dll>
using namespace System;
using namespace System::Reflection;
using namespace System::Diagnostics;

bool has_main(array<MethodInfo^>^ methods)
{
    for each(auto m in methods)
        if(m->Name == "main")
            return true;
    return false;
}

int main()
{
    auto module = Assembly::GetExecutingAssembly()->GetModules(false)[0];
    Debug::Assert(has_main(module->GetMethods()) == false);
    Debug::Assert(has_main(module->GetMethods(BindingFlags::Static | BindingFlags::NonPublic)));
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top