2012-04-19 13 views
25

Il titolo spiega. Ho dll nativi C++ che sto scrivendo wrapper C++/CLI per, che a sua volta saranno importati in C# come riferimento.C++/CLI wrapper per C++ nativo da utilizzare come riferimento in C#

Il problema è che in C# non vedo le classi che ho nel wrapper (importato da DLL).

Quali parole chiave dovrei usare e COME per ri-dichiarare i miei oggetti C++ nativi per diventare visibili in C#?

+0

Le classi wrapper sono pubbliche? La dichiarazione dovrebbe essere "public ref class {...};" – Asik

+0

Lo so. Quello che sto chiedendo è che è una cosa del genere possibile: 'public ref class wrapper_class = native_class;'? Sono possibili questi approcci? – Haix64

+0

Non è così semplice. La classe wrapper ospiterà un oggetto native_class e creerà metodi wrapper per tutti i metodi di native_class che si desidera esporre. I metodi wrapper eseguono il marshalling dei parametri e delegano la chiamata all'oggetto native_class. – Asik

risposta

56

Ok, tutorial. Hai una classe C++ NativeClass che vuoi esporre a C#.

class NativeClass { 
public: 
    void Method(); 
}; 

1) Creare un progetto C++/CLI. Link alla libreria e alle intestazioni C++.

2) Creare una classe wrapper che esponga i metodi desiderati. Esempio:

#include "NativeClass.h" 

public ref class NativeClassWrapper { 
    NativeClass* m_nativeClass; 

public: 
    NativeClassWrapper() { m_nativeClass = new NativeClass(); } 
    ~NativeClassWrapper() { this->!NativeClassWrapper(); } 
    !NativeClassWrapper() { delete m_nativeClass; } 
    void Method() { 
     m_nativeClass->Method(); 
    } 
}; 

3) Aggiungere un riferimento al progetto C++/CLI nel progetto C#.

4) utilizzare il tipo di involucro all'interno di un'istruzione using:

using (var nativeObject = new NativeClassWrapper()) { 
    nativeObject.Method(); 
} 

L'istruzione using assicura Dispose() viene chiamato, che viene eseguito immediatamente il distruttore e distrugge l'oggetto nativo. Avrai altrimenti perdite di memoria e probabilmente morirai orribilmente (non tu, il programma). Nota: The Dispose() method is magically created for you.

+0

Sono stato sfidato da dll non trovato errore, ma comunque, il tuo metodo funziona. Grazie mille! – Haix64

+0

ho seguito questa istruzione ma ricevo tale tipo di errore "utilizzato in un'istruzione using deve essere implicitamente convertibile in" System.IDisposable "" – javapowered

+1

Per evitare perdite di memoria da 4) è necessario implementare anche il finalizzatore! NativeClassWrapper(); che verrà chiamato dal garbage collector – VladL