2009-06-01 23 views

Respuesta

78

Una manera fácil de llamar a C++ es crear un ensamblado contenedor en C++/CLI. En C++/CLI puede llamar al código no administrado como si estuviera escribiendo código nativo, pero puede llamar al código C++/CLI desde C# como si estuviera escrito en C#. El lenguaje fue diseñado básicamente con la interoperabilidad en las bibliotecas existentes como su "aplicación asesina".

Por ejemplo - compilar este con el modificador/CLR

#include "NativeType.h" 

public ref class ManagedType 
{ 
    NativeType* NativePtr; 

public: 
    ManagedType() : NativePtr(new NativeType()) {} 
    ~ManagedType() { delete NativePtr; } 

    void ManagedMethod() 
     { NativePtr->NativeMethod(); } 
}; 

Luego, en C#, agregue una referencia al ensamblado ManagedType, y usarlo de esta manera:

ManagedType mt = new ManagedType(); 
mt.ManagedMethod(); 

Salida this blog post de un ejemplo más explicado.

1

Sure is. This article es un buen ejemplo de algo que puede hacer para comenzar con esto.

Hacemos esto desde C# en nuestros dispositivos Windows Mobile usando P/Invoke.

7

No estoy familiarizado con la biblioteca que usted ha mencionado, pero en general hay un par de maneras de hacerlo:

  • P/Invoke a funciones de biblioteca exportados
  • añadir una referencia a la biblioteca de tipos COM (en caso de que estés tratando con objetos COM).
1

La tecnología utilizada para hacer esto se llama P/Invoke; puedes buscar artículos sobre el tema. Tenga en cuenta que es para llamar a C desde C#, no tanto a C++. Por lo tanto, deberá ajustar su código C++ en un contenedor C exportado por el archivo DLL.

7

P/Invoke es una buena tecnología, y funciona bastante bien, excepto por los problemas en cargar el archivo DLL de destino. Descubrimos que la mejor manera de hacer las cosas es crear una biblioteca estática de funciones nativas y vincular eso en un proyecto de C++ administrado (o C++/CLI) que dependa de él.

+0

Tuve problemas con las devoluciones de llamada y p/invoke. El cambio a C++/CLI ha abordado estos problemas. – MedicineMan