2013-04-04 21 views
14

Ich habe ein ziemlich großes System in C++ implementiert, mit dem ich interagieren muss. Das System hat eine ziemlich große API, eine Anzahl von C++ DLLs. Diese DLLs exportieren C++ - Klassen im Gegensatz zu einer netten C-Stil-API. und ich muss sie aus einem neuen C# -Projekt verwenden.So rufen Sie eine C++ API aus C#

Von dem, was ich .NET wissen hat drei Möglichkeiten, mit nativer Software interagieren:

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

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

  1. Einen Wrapper in C schreiben und mit P/Invoke aufrufen. Das scheint viel zu viel Arbeit.
  2. Einen Wrapper mit COM schreiben. was ich nicht kann, und wenn es nicht wahnsinnig leicht ist, möchte ich nicht lernen, was mir scheint - eine sterbende Technologie.
  3. Einen Wrapper in C++/CLI schreiben. das scheint die geringste Arbeit, wenn auch immer noch viel.

Meine Frage:

  1. Zunächst einmal möchte ich wissen, warum nicht wie .NET erlauben Sie mir einfach die C++ Klassen "as is" zu benutzen? Ich nehme an, es ist eine Frage des Gedächtnisses Management. und wenn es so ist, bin ich mehr als bereit Finalizer zu schreiben, und IDisposable zu implementieren. Von dem, was ich weiß, C++ Klassen sind nur wirklich ausgefallene Strukturen, und da P/Invoke unterstützt Strukturen und Funktionen , die Strukturen als der erste Parameter nehmen, warum nicht unterstützt Klassen?

  2. Zweitens angenommen, ich bin wirklich faul, und es ist eine Menge langweilig, langweilig, Arbeit, Was wäre der beste Weg, um diese DLLs zu verwenden? eine Möglichkeit sie direkt von C# anzurufen wäre das Beste. Wenn nicht, würde ich lieben ein automatisches Werkzeug, um die Wrapper zu produzieren. Auch könnten die DLLs ändern, wahrscheinlich, nur leicht, aber immer noch, ID nicht gezwungen manuell Wrapper umschreiben.

Für eine wirklich gute Antwort, vor allem auf dem ersten Teil oder ein gutes automatisches Werkzeug, ich werde eine Prämie belohnen ...

Danke

+0

1. Da die verschiedenen DLL unterschiedliche Aufrufkonventionen haben. –

+2

http://stackoverflow.com/questions/2120690/tool-for-creating-net-wrappers-for-a-com-dll –

+0

Ich denke, C++/CLI wäre gut. Ich habe jedoch nicht gerade Erfahrung mit C++ - Exporten. – chris

Antwort

6

Wenn Sie bereit sind, den faulen Weg zu gehen, würde ich vorschlagen, ein Werkzeug zu verwenden, um C# -Wrapper für Ihre C++ - Klassen zu generieren. Und natürlich das Werkzeug für einen solchen Wrapper zu erzeugen ist SWIG

Weitere Informationen finden Sie meine alte Antwort auf similar question

+0

Ich akzeptiere Ihre Antwort für den SWIG-Vorschlag. obwohl wir P/Invoke zu einem C Wrapper verwendet haben. –

0

So wie ich es verstehe, In C++ sind die Aufrufkonventionen für Methoden in Klassen ziemlich unordentlich. Auf der Ebene der LIB-Dateien, die von dem Linker verwendet werden, werden die Funktionsnamen "dekoriert" (siehe z. B. Name mangling). Auch das Layout der Klassenvariablen im Speicher unterscheidet sich vermutlich zwischen den verschiedenen Implementierungen von C++ im Vergleich zu C#, weshalb Interop Marshaling ein so großes Thema ist. Ich vermute also, dass Microsoft der Meinung war, dass es zu viele Low-Level-Probleme gibt und somit zu schwer, um es lohnenswert zu machen.

Ich habe beide P/Invoke und COM-Objekte verwendet, um meine C# mit C++ zu verknüpfen, aber ich habe nicht C++/CLI verwendet. Ich habe mich seit Jahren mit COM beschäftigt und es ist sehr ähnlich wie in der eigenen Sprache.Wenn Sie also noch nie eine COM gemacht haben, haben Sie recht, dass es sich in diesem Stadium nicht lohnt, es zu lernen. Wenn eine C++/CLI Schnittstelle zu den Objekten zulassen würde, anstatt alles durch eine C-Schnittstelle zu komprimieren, dann denke ich, dass Sie Recht haben, dass es die beste Route ist.

Verwandte Themen