2010-11-26 18 views
10

Me pregunto cuál es la forma de llamar a un método de clase C# desde C++ (código nativo, no CLI de C++)? Necesita una forma simple y elegantecómo llamar a C# desde C++

+3

Tan bueno como puede ser, el pensamiento duele –

+0

posible duplicado de [Llamar código C# de C++] (http://stackoverflow.com/questions/778590/calling-c-sharp-code-from-c) – cdiggins

Respuesta

9

Convierta su ensamblaje C# en uno COM visible y use las interfaces COM. Esa es la única manera de hacerlo funcionar al lado del IPC hecho por mí mismo hasta donde yo sé. El problema proviene del entorno .NET bajo el cual debe ejecutarse el ensamblado .NET y C++ se ejecuta en su entorno C++ nativo.

La única forma de comunicarse es mediante un mecanismo IPC (sockets, ...) o utilice COM, ya que los procesos tienen que estar "desacoplados".

Aquí hay un tutorial para la solución basada en COM:

+2

Según para Sasha hay 2 formas más en realidad. – gideon

+1

Sí, no hay ningún requisito para el "desacoplamiento" sugerido. El entorno ".Net" es básicamente mscoree.dll y puede cargarse en procesos nativos. – MSalters

9

Sasha Goldshtein es el hombre para estas cosas:

hay de nuevo varias maneras de hacerlo: 1. Invierte P/Invoke (tiene que comenzar desde el delegado .NET pasado como devolución de llamada, por lo que esto solo es bueno si la "acción" comienza en su código .NET); 2. Interoperabilidad COM (toda clase .NET también puede ser un objeto COM, con o sin interfaces explícitas); 3. Clases de contenedor C++/CLI.

Ver http://blogs.microsoft.co.il/blogs/sasha/archive/2008/02/16/net-to-c-bridge.aspx

Ver también:
http://www.gregcons.com/KateBlog/CallingManagedCodeFromNativeCode.aspx

10

puede incrustar cualquier ensamblado CLR (C#, VB.NET, C#, ...) en un programa nativo C++ utilizando lo que se llama "CLR Hosting ". Así es como los programas nativos (como SQL Server) son compatibles con las extensiones de código .NET. P.ej. SQL CLR en SQL Server.

Se carga el CLR en un proceso nativo usando CorBindToRuntimeEx() para .NET 2.0 y .NET 4. CLRCreateInstance() en

detalles se pueden encontrar en MSDN, o un libro de Jeff Richter CLR via C#.

+0

+1 ¡genial! ¡No sabía de esto! – gideon

-1

la manera más simple es usar C++/CLI. Si no puede usar eso en su código, escriba un contenedor dll y llame a ese dll.

+1

la dirección es incorrecta – user496949