2013-04-04 10 views
14

Ho un sistema piuttosto grande implementato in C++ con cui ho bisogno di interagire. Il sistema ha un'API piuttosto grande, un numero di DLL C++. Queste DLL esportano le classi C++, al contrario di una bella API in stile C. e ho bisogno di usarli da un nuovo progetto C#.Come chiamare un'API C++ da C#

Da quello che so .NET ha tre modalità di interazione con software nativo:

  1. P/Invoke -, che funziona solo su C API
  2. oggetti COM
  3. C++/CLI

Quindi, per come ho capito, ho tre approcci di conseguenza:

  1. Scrivere un wrapper in C e chiamarlo con P/Invoke. che sembra troppo lavoro.
  2. Scrittura di un wrapper con COM. che non so come fare e, a meno che non sia così facile, sono riluttante ad apprendere ciò che mi sembra - una tecnologia che muore.
  3. Scrittura di un wrapper in C++/CLI. che sembra il minimo lavoro, anche se ancora molto.

La mia domanda:

  1. Prima di tutto vorrei sapere perché non mi permette .NET semplicemente di usare le classi C++ "così come sono"? Suppongo che sia una questione di gestione della memoria . e se lo è, sono più che disposto a scrivere i finalizzatori, e implementando IDisposable. Da quello che so, le classi C++ sono solo strutture veramente fantasiose, e poiché P/Invoke supporta le strutture e le funzioni che accettano le strutture come primo parametro, perché non supportare le classi ?

  2. In secondo luogo, supponendo che io sia veramente pigro e che sia molto noioso, noioso, , quale sarebbe il modo migliore per utilizzare queste DLL? una possibilità chiamarli direttamente da C# sarebbe la migliore. Altrimenti, vorrei che lo amasse uno strumento automatico per produrre i wrapper. Inoltre, le DLL potrebbero cambiare , probabilmente, solo leggermente ma ancora, l'id piuttosto non essere forzato per ri-scrivere manualmente i wrapper.

Per davvero una buona risposta, soprattutto sulla prima parte, o un buon strumento automatico, ti ricompenserò una taglia ...

Grazie

+0

1. Poiché diverse DLL hanno diverse convenzioni di chiamata. –

+2

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

+0

Penso che C++/CLI sarebbe buono. Tuttavia, non ho esattamente esperienza con le esportazioni C++. – chris

risposta

6

Se si è disposti ad andare in modo pigro, suggerirei di utilizzare uno strumento per generare wrapper C# per le classi C++. E, naturalmente, lo strumento per la generazione di un tale involucro è SWIG

Per ulteriori informazioni, vedere il mio vecchio risposta a similar question

+0

Accetto la tua risposta per il suggerimento di SWIG. anche se abbiamo finito per usare P/Invoke in C Wrapper. –

0

Il modo in cui ho capito, in C++ le convenzioni di chiamata per i metodi nelle classi sono piuttosto confuse. A livello dei file .LIB utilizzati dal linker, i nomi delle funzioni vengono "decorati" (vedere ad esempio Name mangling). Inoltre, il layout delle variabili di classe in memoria è presumibilmente diverso tra tutte le diverse implementazioni di C++ rispetto a C#, motivo per cui Interop Marshaling è un argomento così grande. Quindi la mia ipotesi è che Microsoft abbia giudicato che ci sono troppi problemi di basso livello, e quindi troppo difficili, per renderlo degno di nota.

Ho usato entrambi gli oggetti P/Invoke e COM per collegare il mio C# a C++, ma non ho usato C++/CLI. Mi sono dilettato in COM da anni, ed è molto simile alla sua lingua.Quindi, se non hai mai fatto alcuna COM, penso che tu abbia ragione che non vale la pena impararlo in questa fase. Se un C++/CLI ti consente di interfacciarti agli oggetti, invece di dover spremere tutto attraverso un'interfaccia C, allora penso che tu abbia ragione che sia la strada migliore.