2012-04-19 10 views
25

Título explica. Tengo dlls C++ nativos para los que estoy escribiendo C++/CLI wrappers, que a su vez serán importados en C# como referencia.Contenedor C++/CLI para C++ nativo para usar como referencia en C#

El problema es que en C# no veo las clases que tengo en el contenedor (importado de DLL).

¿Qué palabras clave debo usar y CÓMO volver a declarar mis objetos C++ nativos para que se vuelvan visibles en C#?

+0

¿Las clases contenedoras son públicas? La declaración debe ser "clase de referencia pública {...};" – Asik

+0

Lo sé. Lo que estoy preguntando es que tal cosa es posible: 'public ref class wrapper_class = native_class;'? ¿Son posibles estos enfoques? – Haix64

+0

No es tan simple. La clase contenedora alojaría un objeto native_class y crearía métodos wrapper para todos los métodos de native_class que desea exponer. Los métodos de envoltura simplemente marcan los parámetros y delegan la llamada al objeto native_class. – Asik

Respuesta

56

Ok, tutorial. Tiene una clase de C++ NativeClass que desea exponer a C#.

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

1) Cree un proyecto de C++/CLI. Enlace a su biblioteca C++ y encabezados.

2) Cree una clase contenedora que exponga los métodos que desee. Ejemplo:

#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) Agregue una referencia a su proyecto C++/CLI en su proyecto C#.

4) utiliza el tipo de envoltorio dentro de una instrucción using:

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

La instrucción using asegura Dispose() se llama, que se ejecuta inmediatamente el destructor y destruye el objeto nativo. De lo contrario, tendrá fugas de memoria y probablemente morirá horriblemente (no usted, el programa). Nota: The Dispose() method is magically created for you.

+0

Estoy siendo desafiado por el error dll no encontrado, pero de todos modos, su método funciona. ¡Muchas gracias! – Haix64

+0

seguí esta instrucción pero recibí tal error "el tipo usado en una instrucción using debe ser implícitamente convertible a 'System.IDisposable'" – javapowered

+1

Para evitar pérdidas de memoria desde 4) también debe implementar el finalizador. NativeClassWrapper(); que será llamado por el recolector de basura – VladL

Cuestiones relacionadas