2009-05-18 5 views
1

Ich habe eine Client-Anwendung in nativem C++ - Code, der native C++ - DLLs verwendet. Ich untersuche die Möglichkeit, diesen Code mit C# dlls zu verbinden, da sie viel einfacher zu schreiben wären. Ich entschied mich, eine C++/cli-Bridge-DLL zu schreiben, die mit LoadLibrary geladen werden kann und die Aufrufe an C# dll weitergibt.Verbinden von C++ und C# -Code mit einer C++/CLI-Brücke

Die Kommunikation zwischen dem Client und der DLL ist so, dass der Client einen Zeiger an ein Schnittstellenobjekt übergibt, über die die DLL dann mit dem Client kommuniziert. Ich habe dieses Objekt in den C++/CLI-Bridge-Code für den C# -Code eingepackt, um es zu verwenden.

Die Bridge sollte auch mehrere Funktionen mit __declspec (dllexport) verfügbar machen und diese Aufrufe an die C# dll übergeben, also muss sie einen Zeiger auf eine C# -Schnittstelle haben, an die sie weitergeleitet werden würde. Ich wollte ein C# -Objekt mit dem Gcroot <> Wrapper verwenden, aber das Problem ist, dass ich zirkuläre Abhängigkeiten zwischen diesen beiden DLLs bekomme. C# dll muss auf die Bridge-DLL verweisen, um die Wrapper-Klasse verwenden zu können, und die Bridge-DLL muss auf die C# -Dll verweisen, um die Interface-Klasse zu verwenden.

Ich weiß, ich kann COM verwenden, anstatt das C# -Objekt mit gcroot zu umhüllen, aber ich würde lieber nicht. Gibt es einen Weg dazu?

+0

Können Funktionspunkte/Ereignisse oder Delegaten von C# nicht an C++ übergeben werden. Ich weiß, dass Sie für einige fortgeschrittene Timer-Sachen C++ - Ereignisse problemlos von C# aus behandeln können. – CodingBarfield

+1

Ich weiß, das ist ein alter Beitrag, aber siehe http://stackoverflow.com/questions/13293888/how-to-call-ac-sharp-library-from-native-c-using-c-cli-and-ijw Weitere Informationen zur Verwendung von C# -Bibliotheken in nicht verwaltetem Code über einen C++/CLI-Wrapper. – amalgamate

Antwort

2

Definieren Sie einfach die Schnittstelle in C++/CLI statt C#. Dadurch wird die Abhängigkeit vom C# -Projekt vollständig aufgehoben.

Ich empfehle, das C++/CLI-Projekt als nichts anderes als einen Wrapper zu betrachten - definieren Sie dort keine neuen Schnittstellen. Nehmen Sie einfach, was im aktuellen C++ - Code ist, und wickeln Sie es in "Ref-Klassen", so dass Sie sie aus C# konstruieren und aufrufen können.

+0

Das ist genau das, was ich tue - C++ Code in Ref-Klassen für C# dll um sie zu verwenden. Die Bridge muss jedoch auch Aufrufe von C++ client an C# dll weiterleiten. Um dies zu tun, muss die Bridge einen Teil des C# dll-Codes verwenden, also die Abhängigkeit. Ich sehe nicht, wie es beseitigt werden kann. Fehle ich etwas völlig Offensichtliches? –

Verwandte Themen