Question

System.Reflection ne supporte pas (AFAIK) réflexion sur les méthodes globales dans un ensemble. Au niveau de l'ensemble, je dois commencer par les types de racines.

Mon compilateur peut produire des assemblages avec des méthodes globales et ma lib bootstrap standard est une dll qui comprend des méthodes globales. Mon compilateur utilise System.Reflection à l'assemblage importer des métadonnées au moment de la compilation. Il semble si je dépends System.Reflection, les méthodes globales ne sont pas une possibilité. La solution la plus propre est de convertir toutes mes méthodes standard aux méthodes statiques de la classe, mais le point est, ma langue permet des méthodes globales et les supports CLR, mais System.Reflection laisse un vide.

ildasm montre les méthodes globales très bien, mais je suppose qu'il n'utilise pas System.Reflection lui-même et va droit aux métadonnées et bytecode.

En plus System.Reflection, qui le sait de toute autre réflexion 3ème partie ou libs démontage que je pourrais utiliser (en supposant que je vais finir par libérer mon compilateur libre, ouvert sous licence BSD source).

RESOLU: Il n'y a pas d'écart, sauf dans ma connaissance. Merci de remarquer GetModules, les gars!

Était-ce utile?

La solution

Avez-vous regardé Module.GetMethods ?

  

Renvoie les méthodes globales définies sur le module

Vous pouvez obtenir tous les modules de votre ensemble à l'aide Assembly.GetModules() .

Autres conseils

Vous continuer à battre sur un écart entre le CLR et System.Reflection, mais en fait, il n'y a pas une telle chose comme méthode globale ou un champ global.

Ils ne sont que des méthodes de statiques traditionnelles et les champs statiques qui sont définis dans le type particulier, nommé <Module>, qui doit être présent dans chaque assemblée valide.

Comme Jon dit, vous pouvez utiliser Module.GetMethod et Module.GetField à l'opérateur sur les membres du type.

Si vous voulez plus de contrôle, vous pouvez simplement utiliser Mono.Cecil .

Notez que Module.GetMethod() sans paramètres ne retourne pas les méthodes de tous les modules.
Utilisez GetMethods (BindingFlags) à la place.

C ++ / CLI exemple:

#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)));
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top