2010-12-13 15 views
17

¿Alguien ha trabajado para llamar a un módulo C# desde el módulo C. Intenté buscar en Internet pero no encontré buenos ejemplos. Aunque muchos sitios dicen algo como usar la interoperabilidad COM, pero no pudieron encontrar un ejemplo apropiado o un artículo que lo explicara.Llamando C# desde C

Si alguien me puede ayudar en esto, sería muy bueno

Gracias, Sveerap

Respuesta

16

Hay más que solo interoperabilidad COM si desea llamar al código administrado desde C o C++. El también son los siguientes métodos menos conocidos (tomado de MSDN FAQ):

Como llamar en un ensamblado de .NET de Visual C++ nativo?

Básicamente, hay cuatro métodos para NET llamada de código nativo VC++:

  1. CLR Hosting API: módulo nativo VC++ llama CLR Hosting APIs para alojar CLR, carga y llamar al ensamblado de .NET (código de muestra: CppHostCLR).

  2. interoperabilidad COM: Si el conjunto .NET puede ser expuesto como un componente COM, módulo nativo VC++ puede llamar en el conjunto de .NET a través de NET - interoperabilidad COM (código de ejemplo: CppCOMClient).

  3. inversa PInvoke: El código administrado llama a código nativo pasar un delegado que el código nativo puede volver a llamar (código de ejemplo: CSPInvokeDll).

  4. C++/CLI: Si se permite que el módulo que contiene el código nativo VC++ a enable CLR, la VC++ nativo código puede llamar ensamblado de .NET directamente (código de ejemplo: Consuming C# Library in native C or C++ using C++/CLI)

+0

Gracias por la ayuda, los examinaré en detalle y publicaré mi respuesta – sveerap

+1

Gracias, probé la interoperabilidad COM y podría hacer una especie de aplicación hello world. – sveerap

+0

Los enlaces para las API de One Code y CLR Hosting están rotos. ¿Puede proporcionar una actualización (no pude encontrar los enlaces correctos) –

12

Aquí es una solución. La solución permite llamar a una función C# desde C decorando su función con el atributo [DllExport] (opuesto a P/Invoke DllImport).

https://sites.google.com/site/robertgiesecke/Home/uploads/unmanagedexports

C# código

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

código C

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

Como @ iceflow19 comentado a continuación:

El autor del enlace proporciona un preprocesador CLR IL como un s agregado tep durante la compilación. Dado que los ensamblados utilizan el mismo formato de contenedor binario (DLL) en Windows, si agrega manualmente las compensaciones de funciones .Net en IL a la tabla (la lista de exportaciones de la DLL), Windows es lo suficientemente inteligente como para invocar la CLR para ejecutar ese código cuando se llama de C. Sin embargo, hay sobrecarga. Es una característica no anunciada. Así es como funcionan las bibliotecas administradas mixtas en C++/CLI. Para usarlo solo agrégalo a través de Nuget. El objetivo extra agregado en su archivo de proyecto de MSBuild proporcionará el paso de preprocesamiento de IL

+4

Leí ese enlace, pero él realmente no tenía un ejemplo de usarlo. ¿Qué necesita hacer en el proyecto c para cargar el código C# (dll?)? ¿Necesita 'LoadLibrary'' FreeLibrary' etc. – weston

+1

El autor del enlace proporciona un preprocesador CLR IL como paso adicional durante la compilación. Dado que los ensamblados utilizan el mismo formato de contenedor binario (DLL) en Windows, si agrega manualmente las compensaciones de funciones .Net en IL a la tabla (la lista de exportaciones de la DLL), Windows es lo suficientemente inteligente como para invocar el CLR para ejecutar ese código cuando se llama de C. Sin embargo, hay sobrecarga. Es una característica no anunciada. Así es como funcionan las bibliotecas administradas mixtas en C++/CLI. Para usarlo solo agrégalo a través de Nuget. El objetivo adicional agregado en su archivo de proyecto MSBuild proporcionará el paso de preprocesamiento IL. – iceflow19

+0

Creo que es importante agregar tu comentario en el cuerpo de la respuesta. Gracias por esto. – MajesticRa