Pregunta

¿Es posible llamar a código C ++, posiblemente compilado como un archivo de biblioteca de códigos (.dll), desde el interior de un lenguaje .NET como C #?

Específicamente, C ++ código como la biblioteca de red RakNet.

¿Fue útil?

Solución

Una forma fácil de poner en C ++ es crear un ensamblado de contenedor en C ++ / CLI. En C ++ / CLI puede llamar a código no administrado como si estuviera escribiendo código nativo, pero se puede poner en 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(); } 
}; 

A continuación, en C #, agregue una referencia al ensamblado ManagedType, y usarlo de esta manera:

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

Salida este blog poste para un ejemplo más explicado.

Otros consejos

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

  • P / Invoke para funciones de biblioteca exportados
  • La adición de una referencia a la biblioteca de tipos COM (en caso de que usted está tratando con objetos COM).

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

Sí, se llama P / Invoke .

Esto es un gran sitio de recursos para usarlo con la API de Win32:

http://www.pinvoke.net/

Claro está. Este artículo es un buen ejemplo de algo que puede hacer para empezar a trabajar en esto.

Esto lo hacemos desde C # en nuestros dispositivos Windows Mobile utilizando P / Invoke .

La tecnología utilizada para hacer esto se llama P / Invoke ; puede buscar artículos sobre el tema. Tenga en cuenta que es para llamar C desde C #, C ++ no tanto. Por lo que usted necesita para envolver su código C ++ en un envoltorio C que sus exportaciones DLL.

Ha considerado Apache Thrift?

http://thrift.apache.org/

Parece que una solución muy muy limpio.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top