Reflection - Rausfinden, ob Methode Sub oder Function ist

  • VB.NET

Es gibt 48 Antworten in diesem Thema. Der letzte Beitrag () ist von Samus Aran.

    Reflection - Rausfinden, ob Methode Sub oder Function ist

    Siehe Titel. Wie ich ne DLL lade etc., weiß ich jetzt, aber wie unterscheide ich zwischen Sub/void und Function?
    Edit: Kurz nachdem ich den Post abgeschickt hab, wurde mir klar, dass ich eigentlich auch prüfen kann, was der Rückgabewert ist. m)
    Der Vollständigkeit halber:

    VB.NET-Quellcode

    1. Dim Method As MethodInfo = ...
    2. If TypeOf Method.ReturnType Is GetType(System.Void) Then
    3. ' ...
    4. End If
    In C# ist das Ganze weniger schwammig... :/
    Reflection macht mehr Probleme als erwartet. :P
    Ich hab ne DLL namens "lol.dll", die folgenden Code enthält:

    VB.NET-Quellcode

    1. Public Class lol
    2. Public Property nope
    3. Public Function ARCHIMEDES() As String
    4. Return "NEIN"
    5. End Function
    6. Public Sub ohmyGawd()
    7. End Sub
    8. Private Event WHOOPS()
    9. End Class

    Wenn ich jetzt in nem zweiten Programm Folgendes mache:

    VB.NET-Quellcode

    1. Dim o As Assembly = Assembly.LoadFile(dllpath)
    2. For Each m In o.GetType().GetMethods
    3. Trace.WriteLine(m.Name & " gibt folgendes zurück: " & m.ReturnType.Name)
    4. Next
    krieg ich diese Ausgabe:
    Spoiler anzeigen
    Equals gibt folgendes zurück: Boolean
    GetHashCode gibt folgendes zurück: Int32
    add_ModuleResolve gibt folgendes zurück: Void
    remove_ModuleResolve gibt folgendes zurück: Void
    get_CodeBase gibt folgendes zurück: String
    get_EscapedCodeBase gibt folgendes zurück: String
    GetName gibt folgendes zurück: AssemblyName
    GetName gibt folgendes zurück: AssemblyName
    get_FullName gibt folgendes zurück: String
    CreateQualifiedName gibt folgendes zurück: String
    get_EntryPoint gibt folgendes zurück: MethodInfo
    GetAssembly gibt folgendes zurück: Assembly
    GetType gibt folgendes zurück: Type
    GetType gibt folgendes zurück: Type
    GetType gibt folgendes zurück: Type
    GetExportedTypes gibt folgendes zurück: Type[]
    GetTypes gibt folgendes zurück: Type[]
    GetManifestResourceStream gibt folgendes zurück: Stream
    GetManifestResourceStream gibt folgendes zurück: Stream
    GetSatelliteAssembly gibt folgendes zurück: Assembly
    GetSatelliteAssembly gibt folgendes zurück: Assembly
    get_Evidence gibt folgendes zurück: Evidence
    GetObjectData gibt folgendes zurück: Void
    get_ManifestModule gibt folgendes zurück: Module
    GetCustomAttributes gibt folgendes zurück: Object[]
    GetCustomAttributes gibt folgendes zurück: Object[]
    IsDefined gibt folgendes zurück: Boolean
    LoadFrom gibt folgendes zurück: Assembly
    ReflectionOnlyLoadFrom gibt folgendes zurück: Assembly
    LoadFrom gibt folgendes zurück: Assembly
    LoadFrom gibt folgendes zurück: Assembly
    Load gibt folgendes zurück: Assembly
    ReflectionOnlyLoad gibt folgendes zurück: Assembly
    Load gibt folgendes zurück: Assembly
    Load gibt folgendes zurück: Assembly
    Load gibt folgendes zurück: Assembly
    LoadWithPartialName gibt folgendes zurück: Assembly
    LoadWithPartialName gibt folgendes zurück: Assembly
    get_ReflectionOnly gibt folgendes zurück: Boolean
    Load gibt folgendes zurück: Assembly
    ReflectionOnlyLoad gibt folgendes zurück: Assembly
    Load gibt folgendes zurück: Assembly
    Load gibt folgendes zurück: Assembly
    LoadFile gibt folgendes zurück: Assembly
    LoadFile gibt folgendes zurück: Assembly
    LoadModule gibt folgendes zurück: Module
    LoadModule gibt folgendes zurück: Module
    CreateInstance gibt folgendes zurück: Object
    CreateInstance gibt folgendes zurück: Object
    CreateInstance gibt folgendes zurück: Object
    GetLoadedModules gibt folgendes zurück: Module[]
    GetLoadedModules gibt folgendes zurück: Module[]
    GetModules gibt folgendes zurück: Module[]
    GetModules gibt folgendes zurück: Module[]
    GetModule gibt folgendes zurück: Module
    GetFile gibt folgendes zurück: FileStream
    GetFiles gibt folgendes zurück: FileStream[]
    GetFiles gibt folgendes zurück: FileStream[]
    GetManifestResourceNames gibt folgendes zurück: String[]
    GetExecutingAssembly gibt folgendes zurück: Assembly
    GetCallingAssembly gibt folgendes zurück: Assembly
    GetEntryAssembly gibt folgendes zurück: Assembly
    GetReferencedAssemblies gibt folgendes zurück: AssemblyName[]
    GetManifestResourceInfo gibt folgendes zurück: ManifestResourceInfo
    ToString gibt folgendes zurück: String
    get_Location gibt folgendes zurück: String
    get_ImageRuntimeVersion gibt folgendes zurück: String
    get_GlobalAssemblyCache gibt folgendes zurück: Boolean
    get_HostContext gibt folgendes zurück: Int64
    GetType gibt folgendes zurück: Type

    Was mach ich falsch?
    Probier's so:

    VB.NET-Quellcode

    1. Dim o As Assembly = Assembly.Load(dllpath)
    2. Dim lolType As Type = o.GetType("lol")
    3. For Each m In lolType.GetMethods()
    4. Trace.WriteLine(m.Name & " gibt Folgendes zurück: " & m.ReturnType.Name)
    5. Next
    Was weiß ich, was der Namespace ist? :D

    So. Mit "lol.lol" gehts. Jetzt krieg ich das:
    get_nope
    set_nope
    ARCHIMEDES
    ohmyGawd
    ToString
    Equals
    GetHashCode
    GetType

    Wie filter ich nun die Subs/Funktionen raus, die nicht von mir gemacht wurden und wie muss ich GetMethods aufrufen, um den Namen der Property zu kriegen, und nicht deren Get/Setter?
    Dafür bräuchtest du eine Konfigurationsdatei, die du zuvor ausliest.
    Eine weitere Möglichkeit wäre es, alle Typen der Assembly zu durchlaufen und einen Cast zu deinem gewünschten Typ zu versuchen.
    Klappt es, war's der Typ, den du gesucht hast, war's es nicht, war's es nicht.
    Allerdings ist das nicht das Gelbe vom Ei. Ich wäre immer noch für die Config-Datei, die du einfach in die Assembly packst. ;)
    Wie definierst du Subs/Funktionen, die nicht von dir gemacht wurden?
    Wenn du den Typ gar nicht kennst, wurde gar nichts von dir gemacht, oder etwa doch? :D
    Ich mein die ganzen "ToString", "Equals"-Ausgaben.
    Wie beseitige ich die?

    Edit: Meeensch :<
    Ich hab später DLLs, wo X Klassen drin sind. Deren Events, Properties und Methoden möchte ich dann auslesen und weiterverarbeiten.
    Aber da der Reflection-Namespace nicht für Otto Normalnutzer gemacht wurde, krieg ichs nicht hin, deshalb frage ich hier. :<

    VB.NET-Quellcode

    1. For Each ty In o.GetExportedTypes()
    2. For Each m In o.GetType(ty.Name & "." & ty.Namespace).GetMethods(BindingFlags.DeclaredOnly)
    3. Trace.WriteLine(m.Name)
    4. Next
    5. Next

    Mit DeclaredOnly krieg ich gar nichts zurück, nur mit GetMethods() krieg ich das gleiche Ergebnis wie vorher.
    (Immerhin ist der Kram jetzt einigermaßen namespaceunabhängig)