Frage

Ich möchte meine nicht verwalteten C ++ - Bibliotheken aus meinem C# Code anrufen. Was sind die potenziellen Fallstricke und Vorsichtsmaßnahmen, die getroffen werden müssen? Vielen Dank für Ihre Zeit.

War es hilfreich?

Lösung

Diese Frage ist zu breit. Die einzig vernünftige Antwort ist P/Invoke, aber das ist so, als ob Sie sagen, dass Sie die Win32 -API kennen müssen, wenn Sie für Windows programmieren möchten.

So ziemlich ganze Bücher wurden über P/Invoke geschrieben (http://www.amazon.com/net-com-complete-interoperability-guide/dp/067232170x), und natürlich wurden ganze Websites gemacht: http://www.pinvoke.net/.

Andere Tipps

Es gibt ein paar Routen, die Sie mit dieser einsetzen können - Sie können Ihre nicht verwalteten C ++ - Bibliotheken aktualisieren, um einen verwalteten C ++ - Erweiterungswrapper um sie zu haben und C# diese Klassen direkt zu verwenden. Dies ist ein bisschen zeitaufwändig, bietet aber eine schöne Brücke zum Legacy-nicht verwalteten Code. Beachten Sie jedoch, dass die verwalteten C ++ - Erweiterungen manchmal etwas schwierig sind, um sich selbst zu navigieren, da die Syntax dem nicht verwalteten C ++ ähnlich ist, aber nah genug, dass ein sehr ausgebildetes Auge die Unterschiede erkennen kann.

Die andere Route, um Ihre Umnähte C ++ COM -Klassen zu implementieren und C# über eine autogenerierte Interop -Assemblierung zu verwenden. Dieser Weg ist einfacher, wenn Sie sich gut genug um COM kennen.

Hoffe das hilft.

Sie beschreiben P/Invoke. Das bedeutet, dass Ihre C ++ - Bibliothek sich über eine DLL -Schnittstelle enthüllen muss, und die Schnittstelle muss einfach genug sein, um über die Anrufattribute zu beschreiben. Wenn der verwaltete Code in die nicht verwaltete Welt aufruft, müssen die Parameter untergebracht werden. Es scheint also, dass es einen leichten Leistungsverlust geben könnte, aber Sie müssten einige Tests durchführen, um festzustellen, ob das Marshalle von Bedeutung ist oder nicht.

Der einfachste Weg, um sicherzustellen, dass alle C ++ - Funktionen als "C" -Stilfunktionen aufgedeckt werden. Stellen Sie sicher, dass Sie die Funktion als _stdcall deklarieren.

EXTERN "C" __DECLSPEC (DLLEXPORT) INT _STDCALL Foo (int a)

Stellen Sie sicher, dass Sie das Marshalling richtig machen, insbesondere Dinge wie Zeiger & wchar_t *. Wenn Sie es falsch verstehen, kann es schwierig sein, zu debuggen.

Debuggen Sie es von beiden Seiten, aber nicht beides. Beim Debuggen von Mixed Native & Management kann der Debugger sehr langsam werden. Das Debuggen von 1 Seite gleichzeitig spart viel Zeit.

Spezifischer zu werden würde eine spezifischere Frage erfordern.

Sie können auch über P/Invoke einen unwirksamen Code anrufen. Dies kann einfacher sein, wenn Ihr Code derzeit nicht COM verwendet. Ich denke, Sie müssten wahrscheinlich einige spezifische Exportpunkte in Ihren Code mit "C" -Bindungen schreiben, wenn Sie diese Route besuchen.

Das wahrscheinlich größte, was Sie meiner Erfahrung nach achten müssen, ist, dass der Mangel an deterministischer Müllsammlung bedeutet, dass Ihre Zerstörer nicht laufen, wenn Sie vielleicht gedacht haben, dass sie dies zuvor tun würden. Sie müssen dies berücksichtigen und iDisposable oder eine andere Methode verwenden, um sicherzustellen, dass Ihr verwalteter Code aufgeräumt wird, wenn Sie es möchten.

Natürlich gibt es auch immer Pinvoke, wenn Sie Ihren Code als DLLs mit externen Einstiegspunkten verpackt haben. Keine der Optionen ist schmerzfrei. Sie hängen entweder auf a) Ihre Fähigkeiten in der Schreiben von Com oder von C -Wrappern B) ab) den Arm bei Pinvoke.

Ich würde mich ansehen Schluck, Wir nutzen dies zu einem guten Einfluss auf unser Projekt, um unsere C ++ - API anderen Sprachplattformen auszusetzen.

Es ist ein gut gepflegtes Projekt, das effektiv einen dünnen Wrapper um Ihre C ++ - Bibliothek erstellt, mit dem Sprachen wie C# direkt mit Ihrem nativen Code kommunizieren können. Sie speichern Sie die Mühe, den Klebercode implementieren (und Debuggen) implementieren zu müssen.

Wenn Sie ein gutes Pinvoke -Beispielen wünschen, können Sie sich ansehen Pinvoke.net. Es enthält Beispiele, wie Sie den größten Teil von Win -API -Funktionen bezeichnen können.

Sie können auch Tool aus diesem Artikel verwenden CLR innen nach außen: Pinvoke Das übersetzt Ihre .h -Datei in C# Wrapper.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top