llamar al código administrado desde un código no administrado

Quiero llamar a mi código .NET desde C ++ no administrado. El punto de entrada de mi proceso está basado en .NET, así que no tengo que preocuparme por alojar el CLR. Sé que se puede hacer utilizando contenedores 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 / más fácil.

¡Gracias!

Suponiendo que está hablando de código real no administrado, no solo C ++ nativo ejecutándose en un ensamblado de modo mixto comstackdo con / clr, la manera más fácil es crear un contenedor para su código .NET en C ++ / CLI. A continuación, puede exportar los métodos C ++ / CLI simplemente marcándolos con __declspec (dllexport).

Alternativamente, si tiene control sobre la invocación del código no administrado, puede ordenar punteros a sus métodos .NET y pasarlos al código no administrado.

Mire 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] (opuesto a P / Invoke DllImport) .

Exmaple:

C # code

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 el dll en el proyecto no administrado?

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

Eche un vistazo a la clase GCHandle y la palabra clave gcroot, que proporciona un contenedor tipo safesa y con plantillas alrededor de GCHandle.

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

MSDN tiene un tutorial básico aquí .

Creo que estás buscando Invocar PInvoke. Si buscas en Google para revertir pinvoke obtendrás muchas entradas útiles. Creo que el 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 instrucción de uso para usar su DLL .NET en su código. Algo como:

  #using  

y luego simplemente puede hacer que los objetos de sus clases administradas sean como:

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

Si desea hacer de este obj un miembro de datos de su clase, el uso de gcroot es el camino a seguir.