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
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
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);
}
Danke! aber wie kann ich es mit nativen DLLs (nicht verwaltet) tun? – user361526
Sie alle die Ausfuhren in einer DLL unter Verwendung von Dependency Walker sehen können, welche ist ein kostenloses Programm von Microsoft: http://en.wikipedia.org/wiki/Dependency_walker
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
Wenn ihr eine verwaltete DLL: Verwenden Reflexion
Wenn seine unmanaged: Sie müssen die DLL Exporttabelle
aufzuzählen Sind Sie unmananged oder verwaltete DLLs sprechen? – VVS
zur Laufzeit oder Designzeit? –
Ich versuche es programmatisch zur Laufzeit, sie können nicht verwaltet oder verwaltet werden – user361526