Frage

System.Reflection nicht (AFAIK) Unterstützung auf globale Methoden in einer Anordnung widerspiegelt. Auf der Montageebene, muss ich mit den Wurzeltypen starten.

Meine Compiler können Baugruppen mit globalen Methoden produzieren, und mein Standard-Boot lib ist eine DLL, die einige globale Methoden enthält. Mein Compiler verwendet System.Reflection Montage Metadaten bei der Kompilierung zu importieren. Es scheint, wenn ich auf System.Reflection abhängen, globale Methoden sind nicht eine Möglichkeit. Die sauberste Lösung ist, alle meine Standardmethoden zur Klasse statischer Methoden zu konvertieren, aber der Punkt ist, meine Sprache globale Methoden erlaubt, und die CLR unterstützt, aber System.Reflection hinterlässt eine Lücke.

ildasm zeigt die globalen Methoden ganz gut, aber ich nehme an, es nicht System.Reflection nicht verwendet selbst und geht direkt auf die Metadaten und Bytecode.

Neben System.Reflection ist jemand Kenntnis von einer anderen dritten Partei Reflexion oder LIBS Demontage, dass ich Verwendung von (vorausgesetzt, ich schließlich mein Compiler als frei veröffentlichen, BSD Open-Source-Lizenz) machen könnte.

GELöST: Es gibt keine Lücke, außer in meinem Wissen. Vielen Dank für den Hinweis auf GetModules, Jungs!

War es hilfreich?

Lösung

Haben Sie sich unter Module.GetMethods ?

  

Gibt die globalen Methoden definiert auf dem Modul

Sie können alle Module der Assembly mit Assembly.GetModules() bekommen.

Andere Tipps

Sie halten auf einer Lücke zwischen der CLR zu schlagen und System.Reflection, aber eigentlich gibt es nicht so etwas wie eine globale Methode oder ein globales Feld.

Sie sind nur traditionelle statische Methoden und statische Felder, die in bestimmtem Typ namens <Module> definiert, die in jedem gültigen Montag sein muss.

Wie Jon sagte, können Sie Module.GetMethod und Module.GetField an Betreiber zu den Mitgliedern des Typs verwendet werden.

Wenn Sie mehr Kontrolle wünschen, können Sie nur verwenden, Mono.Cecil .

Beachten Sie, dass Module.GetMethod() ohne Parameter werden nicht alle Moduls Methoden zurück.
Verwenden GetMethods (Binding) statt.

C ++ / CLI-Beispiel:

#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)));
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top