2009-05-16 7 views
2

Ist es möglich, jede in einer DLL vorhandene Funktion aufzulisten? Wie wäre es mit seiner Unterschrift? Kann ich das in C# tun? Oder muss ich auf niedrigem Niveau gehen, um dies zu tun?Auflisten von DLL-Funktionen?

Grüße und tks, Jose

+2

aufzuzählen Sind Sie unmananged oder verwaltete DLLs sprechen? – VVS

+2

zur Laufzeit oder Designzeit? –

+0

Ich versuche es programmatisch zur Laufzeit, sie können nicht verwaltet oder verwaltet werden – user361526

Antwort

3

Wenn es ein .NET-DLL RedGate's Reflector die Methoden auflisten kann und sogar versuchen, den Code zu zerlegen. Es ist ein großartiges Element für alle Entwickler-Toolbox und es ist kostenlos

Bearbeiten: Wenn Sie versuchen, die Typen und Methoden zur Laufzeit zu lesen, möchten Sie Reflection verwenden. Sie müssten die Assembly und GetExportedTypes laden. Dann iterieren Sie über die Members an die Methods und Properties. Hier ist ein Artikel von MSDN, der ein Beispiel für das Iterieren über die MemberInfo Information enthält. Hier ist auch ein MSDN Magazin Artikel, Extracting Data from .NET Assemblies.

Zum Schluss, Hier ist eine kleine Testmethode, die ich für die Ausführung einer Methode auf einem geladenen Objekt geschrieben habe.

In diesem Beispiel ClassLibrary1 hat eine Klasse von Class1:

public class Class1 
{ 
    public bool WasWorkDone { get; set; } 

    public void DoWork() 
    { 
     WasWorkDone = true; 
    } 
} 

Und hier ist der Test:

[TestMethod] 
public void CanExecute_On_LoadedClass1() 
{ 
    // Load Assembly and Types 
    var assm = Assembly.LoadFile(@"C:\Lib\ClassLibrary1.dll"); 
    var types = assm.GetExportedTypes(); 

    // Get object type informaiton 
    var class1 = types.FirstOrDefault(t => t.Name == "Class1"); 
    Assert.IsNotNull(class1); 

    var wasWorkDone = class1.GetProperty("WasWorkDone"); 
    Assert.IsNotNull(wasWorkDone); 

    var doWork = class1.GetMethod("DoWork"); 
    Assert.IsNotNull(doWork); 

    // Create Object 
    var class1Instance = Activator.CreateInstance(class1.UnderlyingSystemType); 

    // Do Work 
    bool wasDoneBeforeInvoking = 
      (bool)wasWorkDone.GetValue(class1Instance, null); 
    doWork.Invoke(class1Instance, null); 
    bool wasDoneAfterInvoking = 
      (bool)wasWorkDone.GetValue(class1Instance, null); 

    // Assert 
    Assert.IsFalse(wasDoneBeforeInvoking); 
    Assert.IsTrue(wasDoneAfterInvoking); 
} 
+1

Danke! aber wie kann ich es mit nativen DLLs (nicht verwaltet) tun? – user361526

1

Für reguläre win32 DLLs, siehe the Dumpbin utility. Es ist in Visual-C++ enthalten (einschließlich der kostenlosen "Express" Version glaube ich).

Beispiel:

c:\vc9\bin\dumpbin.exe /exports c:\windows\system32\kernel32.dll 
2

Wenn ihr eine verwaltete DLL: Verwenden Reflexion

Wenn seine unmanaged: Sie müssen die DLL Exporttabelle