Moin!
möchte auf die Methoden einer com-DLL zugreifen, hab aber keine informationen über deren inhalt. was kann man da machen?
danke schonmal!
Probiere mal
Assemby a = Assembly.LoadFile("c:\meine.dll");
Type [] types = a.getTypes();
// Methodenaufruf: (Alles per Reflection)
MethodInfo mi = types[0].getMethod("doIt");
mi.Invoke(null,null);
// Liste alle Methoden
MethodInfo [] mis = types[0].getMethods();
foreach(MethodInfo info in mis)
{
Console.WriteLine(info.Name);
}
Naja, so funktioniert es mit Assemblies, die mit .NET programmiert wurden.
Probiers mal aus, sag mir dann aber ob es geklappt hat
@cmpxchg:
geht anscheinend nur mit .net dlls, schmeißt einen fehler: falsches format!
Du hast zwei Möglichkeiten:
Statisches Binden. Dazu fügst du der Komponentenleiste einen neuen Eintrag hinzu. In dem folgende Dialog gehst du auf den COM-Reiter und wählst deine Klasse aus. Nun wird ein COM-Wrapper erstellt und in das Projekt einebunden. Du kannst die erstellte Klase genauso nutzen wie eine .NET-Klasse. Sie gibt somit auch Auskunft über ihre Methoden un Properties (Klassenexplorer oder Intellisense).
Dynamisches Binden zur Laufzeit. Hier musst du allerding "wissen" wie die Methoden und Properties heissen. Über einen COMInspector aber leicht rauszufinden: COM-Objekte sind selbtsbeschreibend.
Es gibt noch die Möglichkeit beides zu kombinieren... isrt aber komplex und läuft über Codegenerierung zur Laufzeit.
die erste möglichkeit funktioniert soweit, aber was ist ein COMInspector
nutze übrigens sharpdevelop und hab die com-dll über referenz hinzufügen eingefügt!
noch eine frage:
wie importiere ich nicht statische methoden. beim dllimport wird ja static extern erwartet.
und wie kann ich über DllImport einen konstruktor aus einer com-dll importieren.
ich bedanke mich schonmal für die hilfe!
bin schon ein gutes stück weitergekommen!!!
Mittels DLLImport geht das nicht. Einzige Möglichkeit ist die Erstellung eines managed C++-Wrappers.
Mit dem ComImport-Attribut kann man es machen.
Hier hatte ich ein Beispiel gepostet:
ActiveX ohne Verweis
Einfacher ist es aber in der IDE oder mit TlbImp.exe eine Wrapper-DLL generieren zu lassen, so wie svenson es vorschlägt und wie du es auch schon gemacht hast -> Referenz aus COM einbinden. Es wird der gleiche Code generiert, den man sonst per Hand schreiben müsste.
Gruss
Pulpapex
Hups, sorry, hatte die Frage nicht aufmerksam genug gelesen. Meine Antwort bezog sich auf C++-Klassen in nicht-COM-Dlls.
danke! funktioniert jetzt! wenn ich die com-dll über referenz hinzufügen einbinde, ist aber das verzeichnis fest, so dass bei installation immer der gleiche pfad benutzt werden muss. aber da eignet sich ja das system32 verzeichnis.
oder kann man die dll irgendwie einbinden und dabei einen bestimmten pfad festlegen wie im installationssetup gewünscht.