Pregunta

Quiero llamar a mi código .NET desde C ++ no administrado. Mi punto de entrada del proceso está basado en .NET, por lo que no tengo que preocuparme por alojar el CLR. Sé que se puede hacer usando envoltorios COM para objetos .NET, pero me gustaría acceder a métodos estáticos individuales de clases administradas, por lo que COM no es mi ruta más corta / fácil.

¡Gracias!

¿Fue útil?

Solución

Suponiendo que está hablando de código no administrado real, no solo de C ++ nativo que se ejecuta en un ensamblaje de modo mixto compilado con / clr, la forma más sencilla es crear un contenedor para su código .NET en C ++ / CLI. Luego, puede exportar los métodos C ++ / CLI simplemente marcándolos con __declspec (dllexport).

De manera alternativa, si tiene control sobre la invocación del código no administrado, puede ordenar los punteros de función a sus métodos .NET y pasarlos al código no administrado.

Otros consejos

Mira esta solución: https://sites.google.com/site/robertgiesecke/Home/uploads/ Unmanagedexports La solución permite llamar a la función C # desde C decorando su función con el atributo [DllExport] (al lado de P / Invoke DllImport).

Ejemplo :

código C #

class Test
{
     [DllExport("add", CallingConvention = CallingConvention.StdCall)]
     public static int Add(int left, int right)
     {
         return left + right;
     } 
}

Código C:

 extern "C" int add(int, int);

 int main()
 {
      int z = add(5,10);
      printf("The solution is found!!! Z is %i",z);
      return 0;
 }

Salida:

The solution is found!!! Z is 15

Actualización : hay una pregunta y una buena respuesta en los comentarios:

¿Cómo incluyo la dll en el proyecto no administrado?

Debe vincularse al archivo .lib que se genera al compilar su código C # ( https://msdn.microsoft.com/en-us/library/ba1z7822.aspx?f=255&MSPPError=-2147217396 )

Eche un vistazo a GCHandle class y la palabra clave gcroot, que proporciona una envoltura templada contra tipos alrededor de GCHandle.

Puede usarlos para mantener una referencia a un objeto CLR (o un valor en caja) en código nativo.

MSDN tiene un tutorial básico aquí .

Creo que estás buscando Reverse PInvoke. Si buscas en Google para Pinvoke inverso obtendrás muchas entradas útiles. Creo que lo siguiente tiene un buen ejemplo rápido y sucio.

PInvoke -Reverse PInvoke y __stdcall - __cdecl

Su código de llamada es C ++ con / clr habilitado. ¿Derecha?

Si es así, entonces simplemente puede usar la declaración de uso para usar su dll .NET en su código. Algo como:

#using <Mydll.dll>

y luego simplemente puedes hacer los objetos de tus clases administradas como:

MyNameSpace::MyClass^ obj = new MyNameSpace::MyClass();

Si quieres que este objeto sea un miembro de datos de tu clase, lo mejor es usar gcroot.

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