Verwenden einer Klasse, die in einer C ++ - DLL in c # -Code definiert ist
Ich habe eine dll, die in c++ geschrieben ist, habe ich diese dll in mein c# - code. Nach der Suche habe ich gefunden, dass die Verwendung von P/Invoke geben würde, die mir den Zugang zu der Funktion, die ich brauche, aber diese Funktionen definiert sind, in eine Klasse nicht-statische private member-Variablen. Also ich muss in der Lage sein zum erstellen einer Instanz dieser Klasse, um die korrekte Verwendung der Funktionen. Wie kann ich einen Zugang zu dieser Klasse, so dass ich eine Instanz erstellen? Ich habe nicht in der Lage war, einen Weg zu finden, dies zu tun.
Ich denke ich sollte auch beachten, dass die c++ - dll ist nicht mein code.
InformationsquelleAutor der Frage Dan Vogel | 2008-11-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es keine Möglichkeit, direkt die Verwendung einer C++ - Klasse in der C# - code. Sie können PInvoke in eine indirekte Mode, um Zugang zu Ihrem Typ.
Das grundlegende Muster ist, dass für jede Memberfunktion in Klasse Foo erstellen Sie einen zugeordneten non-member Funktion, die Anrufe in der member-Funktion.
Nun ist es eine Frage der PInvoking diese Methoden in Ihrem C# - code
Der Nachteil ist, Sie haben eine unangenehme IntPtr übergeben herum, aber es ist eine etwas einfache Sache, erstellen Sie ein C# wrapper-Klasse um diesen Zeiger zu einem brauchbaren Modell.
Selbst wenn Sie nicht im Besitz dieses Codes können Sie erstellen, die eine andere DLL, die Packungen der original-DLL und bietet eine kleine PInvoke-Schicht.
InformationsquelleAutor der Antwort JaredPar
Marschall C++ - Klasse, und verwenden Sie die PInvoke
C++ - Code ,ClassName.h
C++ - Code, ClassName.cpp
C++ - Code, ClassNameCaller.h-Datei, die für die Aufrufer-Funktion
C++ - Code, ClassNameCaller.cpp Datei, die für die Aufrufer-Funktion
C# - code
InformationsquelleAutor der Antwort Amir Twito
Hier ist ein Beispiel, wie Aufruf von C++ - Klassen-Methode von VB - C# - Sie haben nur zu schreiben, die Beispiel-Programm in Schritt 4.
InformationsquelleAutor der Antwort Dmitry Khalatov
myfile.ich
download Schluck aus swig.org
swig -c++ -csharp myfile.ich
Blick auf die Ausgabe, zu sehen, ob es für Sie arbeiten.
InformationsquelleAutor der Antwort patr0x
Müssen Sie möglicherweise schreiben Sie eine Vermittler-DLL (in C++, vielleicht) , übernimmt dies für Sie und stellt die Schnittstelle, die Sie brauchen. Die DLL wäre beladen der 3rd-party-DLL erstellen einer Instanz der C++ - Objekt, und setzen Ihre member-Funktionen als benötigt, über welche API Sie gestalten. Sie würde dann mit P/Invoke, um auf Ihre API und sauber Bearbeiten das Objekt.
Hinweis: Für die API der DLL, versuchen Sie halten die Datentypen beschränkt sich auf primitive (long, int, char*, etc.) um zu verhindern, dass Modul-Grenze Probleme.
InformationsquelleAutor der Antwort Brian
Ich Stimme mit JaredPar.
Erstellen von Instanzen von nicht verwalteten Klassen in managed-code nicht möglich sein sollte.
Andere Sache ist die, wenn Sie könnte, kompilieren Sie die DLL im managed-C++ - oder eine COM-Komponente, es wäre viel einfacher/
InformationsquelleAutor der Antwort badbadboy
Die Art, wie ich getan habe, dies ist durch die Schaffung einer dünnen Verwaltete C++ - wrapper um meine unmanaged C++ - DLL. Der managed wrapper enthält "proxy" - Klassen, die wrap-around der nicht verwaltete code Freilegung der Oberfläche, die benötigt der .NET-Anwendung.
Das ist ein bisschen doppelt Arbeit, aber es lassen sich Recht nahtlos den Betrieb in normalen Umgebungen. Dinge tun, um es schwieriger, mit Abhängigkeiten, die in einigen Fällen (wie ASP.NET) aber Sie werden wahrscheinlich nicht laufen.
InformationsquelleAutor der Antwort Joris Timmermans