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:

  1. P/Invoke - das funktioniert nur auf C-APIs
  2. COM-Objekte
  3. C++/CLI

Also So wie ich es verstehe, habe ich drei Ansätze entsprechend:

  1. Schreiben einen wrapper in C und nennen das dann mit P/Invoke. das scheint viel zu viel Arbeit.
  2. 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 .
  3. Schreiben einen wrapper in C++/CLI. das scheint die am wenigsten Arbeit, aber immer noch eine Menge.

Meine Frage:

  1. 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?

  2. 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.

InformationsquelleAutor AK_ | 2013-04-04
Schreibe einen Kommentar