2009-02-20 8 views
42

Ho una DLL C++ non gestita che esporta semplicemente una singola classe (non COM ... è solo una semplice classe C++) come interfaccia. Voglio usare questa classe in C# ma mi è stato detto che non può essere semplicemente importata in C#.Uso della DLL di classe C++ nell'applicazione C#

Qual è il modo corretto di utilizzare questa classe nella mia applicazione C#?

+1

È una classe COM? –

+1

Scusa avrei dovuto essere più specifico. Questa NON è una classe COM. È solo una semplice vecchia classe C++. – cjserio

risposta

43

modo semplice classe assumendo Foo:

  1. Creare un progetto C++/CLI, chiamano questa FooWrapper.
  2. Fare in modo che FooWrapper dipenda dalla dll non gestita (tuttavia normalmente lo si farebbe).
  3. Creare una classe gestita ManagedFoo che contiene un singolo campo di istanza privato di tipo Foo *.
  4. fornisce funzioni di wrapping pubblico in ManagedFoo che inoltrano al campo dell'istanza sottostante.
  5. Opzionalmente (ma consigliato):
    • parametri convertire da idiomi NET (archi e simili) a idiomi C++ (std :: string o char *)
    • intercettare le eccezioni non gestite e buttare quelle gestite invece

Poi fate il vostro codice C# dipendono dal FooWrapper progetto/dll e assicurarsi che il ll non gestito è correttamente distribuito con esso, come questo viene fatto dipende la dll non gestito, ma nella stessa directory è normalmente sufficiente .

Se le funzioni non si basano su istanze della classe poi è ancora più semplice P/Invoke

+0

Non chiamerei facoltativo (5) se l'OP ha a che fare con stringhe o eccezioni. –

+0

Cosa farei se volessi eliminare il livello C++ Dll e creare un progetto C++/CLI che sia la DLL e il wrapper in uno? Più specificamente, la mia DLL C++ corrente collega semplicemente un po 'di librerie statiche insieme in una bella interfaccia. Posso fare tutto questo in un progetto C++/CLI? – cjserio

+0

Sì, puoi fare tutto in questo C++/CLI – ShuggyCoUk

2

È necessario un proxy (pattern GoF) intermediario per colmare il gestito di confine/non gestito.

due opzioni:

  • A C++/CLI involucro
  • Un wrapper COM.

Il primo sarà più diretto e quest'ultimo ha due passaggi in C++ puro -> COM -> .NET.

+0

potresti fornire alcuni link/informazioni per la seconda opzione. Grazie – rsjethani

+0

@rsjethani: non ne ho a disposizione: creare un wrapper COM significa scrivere (nativo) COM. Quindi usando 'implib' per creare il wrapper per .NET. – Richard

8

Questa risposta potrebbe essere eccessivo per una singola libreria di classi, ma SWIG è una buona soluzione per "avvolgere" classi C/C++ per l'utilizzo da altre lingue. Funziona bene con C#.

Vederehttp://www.swig.org/.

3

DllImport è la soluzione migliore. C'è un po 'di massaggio di tipo di dati, soprattutto se si passano le strutture, ma si può fare quasi tutto con esso.

2

A volte è più semplice fornire la propria interfaccia C. SWIG non è banale da configurare. Ho usato gestito C++ e C++/CLI e stanno bene. Il più semplice era semplicemente fare un wrapper C (e può essere utilizzato da qualsiasi altra lingua poiché la maggior parte ha un modo per chiamare una funzione C).