So rufen Sie eine C++ - API von C#
Ich habe ein ziemlich großes system in C++ implementiert, die ich brauche, um die Interaktion mit. Das system hat eine ziemlich große API, eine Reihe von C++ - DLLs. Diese DLLs exportieren von C++ - Klassen, im Gegensatz zu einer schönen C-style API. und ich muss an Sie von Sie ein neues C# - Projekt.
Was weiß ich .NET hat drei Möglichkeiten der Interaktion mit native software:
- P/Invoke - das funktioniert nur auf C-APIs
- COM-Objekte
- C++/CLI
Also So wie ich es verstehe, habe ich drei Ansätze entsprechend:
- Schreiben einen wrapper in C und nennen das dann mit P/Invoke. das scheint viel zu viel Arbeit.
- Schreiben Sie einen wrapper mit COM. was ich nicht weiß, wie zu tun, und es sei denn, es ist wahnsinnig leicht, ich bin nur ungern zu lernen, was scheint mir - eine sterbende Technologie .
- Schreiben einen wrapper in C++/CLI. das scheint die am wenigsten Arbeit, aber immer noch eine Menge.
Meine Frage:
-
Zuallererst würde ich gerne wissen, warum nicht .NET erlauben Sie mir einfach
die Verwendung der C++ - Klassen "wie es ist"? Ich gehe davon aus, dass es eine Frage des Speichers
management. und wenn es ist, ich bin mehr als bereit, zu schreiben, Finalizer,
und Implementierung von IDisposable . Von dem, was ich weiß, C++ - Klassen sind
wirklich ausgefallene Strukturen, und da P/Invoke unterstützt Strukturen und Funktionen
nehmen, dass Strukturen, wie der erste parameter, warum nicht unterstützen
Klassen? -
Zweite, vorausgesetzt, ich bin wirklich faul, und es ist eine Menge langweilig, langweilig,
Arbeit, Was wäre die beste Möglichkeit, um diese DLL ' s? eine Möglichkeit
rufen Sie direkt aus C# wäre das beste. Wenn nicht, dann würde ich
Liebe ist ein automatisches tool zum erzeugen der Wrapper. Auch die DLLs könnte
ändern, wahrscheinlich, nur ein bisschen, aber immer noch, id eher nicht gezwungen werden
manuell neu schreiben Wrapper.
Für eine wirklich gute Antwort, vor allem auf den ersten Teil, oder eine gute Automatik-tool, werde ich die Belohnung ein Kopfgeld...
Danke
- 1. Da verschiedene DLL ' s haben unterschiedliche Aufrufkonventionen.
- stackoverflow.com/questions/2120690/...
- Ich denke, dass C++/CLI wäre gut. Ich weiß nicht genau, haben Erfahrung dies mit C++ - Exporte, obwohl.
- Cxxi klingt wie das, was Sie wollen, aber ich bin mir nicht sicher, wie brauchbar ist es dennoch.
- Sein behandelt gut im P/Invoke für den C Aufrufkonventionen Und die C++ - system ist mit VC++ ...
- Gut, man muss es sagen, wie die Interaktion mit der DLL irgendwie.
extern
Erklärungen scheinen als gute Art zu tun, wie jeder andere. .NET assemblies können direkt verwiesen werden, weil Sie bereits enthalten Metadaten, die zur Beschreibung der Einstiegspunkte. - Ich könnte mir vorstellen, dass der Hauptgrund für die nicht-Unterstützung von C++ - Klassen ist, da C++ keine standardisierte ABI. Und Nein, C++ - Klassen sind nicht nur ausgefallene Strukturen. Eine bestimmte Klasse möglicherweise werden Sie mit [virtual] mehrfache Vererbung für das Beispiel. Hinter den kulissen Umsetzung, die völlig im Ermessen des compiler-Anbieter zum Beispiel.
- Ich bin bereit, zu erklären, was immer es wissen will, ich bin sogar bereit zu schreiben, mich selbst, einem tool, das generieren von extern-Deklarationen. Was ich nicht bereit bin zu tun, ist schreiben eine Menge von wrapper-code von hand. und trug Pflege es.
- Meine Recherchen im Internet die Röhren scheinen zu sein, dass es am einfachsten ist, zu schreiben, Ihre eigenen managed C++ zu handeln, die als Wrapper für die nicht verwaltete C++. Schauen Sie sich dieses schreiben von den P/Invoke-versus bridging managed C++ DLL unter: codeproject.com/Articles/18032/How-to-Marshal-a-C-Class
- StarPilot richtig ist, mit C++/CLI als "glue" - Sprache ist die beste option, wenn Sie brauchen, um eine Schnittstelle zwischen .NET und native C++ - code.
- Ich nehme an, es hängt auch von der Anzahl der C++ - Klassen. Warum würden Sie setzen 1000 C++ - Klassen .NET wie das ist? Die meisten der Zeit, setzen wir eine Teilmenge der C++ - Klassen, eine "service"-artige Fassade, und wenn man sieht, wie Microsoft hat es für GDI+ zum Beispiel, haben Sie einfach ausgesetzt, einige davon mit einfachen DLL-Exporten und bauen einen neuen Satz .NET style-Objekt in C#. Ich finde es gut, um einen klaren Vertrag zwischen den C++/nicht verwaltete Welt und die .NET/verwalteten Welt. Halten Sie ein mix zwischen den beiden Welten ist eine Belastung IMHO.
- Jedes mal, wenn ich mit C++ bin ich noch mehr davon überzeugt, dass es nervt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie bereit sind, sich auf die faule Weg, ich würde vorschlagen, mit einem Werkzeug zur Generierung von C# - wrapper für C++ - Klassen. Und natürlich die Werkzeug zur Erstellung solcher wrapper ist SCHLUCK
Weitere Informationen finden Sie unter " meine alte Antwort ähnliche Frage
Ich verstehe es so, in C++ die Aufrufkonventionen für Methoden in den Klassen sind ziemlich chaotisch. Auf der Ebene der .LIB-Dateien, die vom linker verwendet, die Funktion Namen bekommen "verziert" (siehe z.B. Die Name manglings). Auch das layout der class-Variablen im Speicher ist vermutlich der Unterschied zwischen all den verschiedenen Implementierungen von C++ im Vergleich zu C#, das ist der Grund, warum Interop-Marshalling ist so ein großes Thema. Also meine Vermutung ist, dass Microsoft entschieden, dass es zu viele low-level-Probleme, und damit zu schwer, um es lohnt.
Ich habe mit P/Invoke oder COM-Objekte, um link-mein C# zu C++, aber ich habe Sie nicht benutzt, C++/CLI. Ich habe es einmal mit COM seit Jahren, und es ist sehr viel wie es die eigene Sprache. Also, wenn Sie noch nie getan, alle COM ich denke, du hast Recht, dass es nicht lohnt, Sie zu lernen in dieser Phase. Wenn ein C++/CLI-würde Sie Schnittstelle, um die Objekte, anstatt zu quetschen alles durch ein C-interface, dann denke ich, du hast Recht, dass es dann die beste route.