Saltar al contenido

Llamar código C# desde C++

No dudes en divulgar nuestra web y códigos en tus redes sociales, necesitamos de tu ayuda para hacer crecer nuestra comunidad.

Solución:

Hay varias formas de que una aplicación de C++ invoque funciones en una DLL de C#.

  1. Usando C++/CLI como una DLL intermedia
    • http://blogs.microsoft.co.il/sasha/2008/02/16/net-to-c-bridge/
  2. Invertir P/Invocar
    • http://tigerang.blogspot.ca/2008/09/reverse-pinvoke.html
    • http://blogs.msdn.com/b/junfeng/archive/2008/01/28/reverse-p-invoke-and-exception.aspx
  3. Usando COM
    • http://msdn.microsoft.com/en-us/library/zsfww439.aspx
  4. Uso de alojamiento CLR (ICLRRuntimeHost::ExecuteInDefaultAppDomain())
    • http://msdn.microsoft.com/en-us/library/dd380850%28v=vs.110%29.aspx
    • http://msdn.microsoft.com/en-us/library/ms164411%28v=vs.110%29.aspx
    • https://stackoverflow.com/a/4283104/184528
  5. Comunicación entre procesos (IPC)
    • Cómo invocar de forma remota otro método de proceso desde la aplicación C#
    • http://www.codeproject.com/Tips/420582/Inter-Process-Communication- between-Csharp-and-Cpl
  6. Editar: aloje un servidor HTTP e invoque a través de verbos HTTP (por ejemplo, una API de estilo REST)

Compile su código C++ con el /clr bandera. Con eso, puede llamar a cualquier código .NET con relativa facilidad.

Por ejemplo:

#include 
#include 

int _tmain(int argc, _TCHAR* argv[])

    System::DateTime now = System::DateTime::Now;
    printf("%d:%d:%dn", now.Hour, now.Minute, now.Second);

    return 0;

¿Cuenta esto como “C++”? Bueno, obviamente no es C++ estándar

Consulte Exportación de Dll.

OIA: exactamente lo contrario de cómo DllImport obras.

https://github.com/3F/DllExport

Tiene soporte para Windows, con soporte multiplataforma en proceso.

Código C# (que llamamos desde C++):

[DllExport]
public static int _add(int a, int b)

    return a + b;


[DllExport]
public static bool saySomething()

    DialogResult dlgres = MessageBox.Show(
        "Hello from managed environment !",
        ".NET clr",
        MessageBoxButtons.OKCancel
    );

    return dlgres == DialogResult.OK;

Código C++ (que llama al código C# anterior):

typedef int(__cdecl *_add)(int a, int b);
typedef bool(__cdecl *saySomething)();

auto pAdd = (_add)GetProcAddress(lib, "_add");
int c = pAdd(5, 7);

auto pSaySomething = (saySomething)GetProcAddress(lib, "saySomething");
bool dlgres = pSaySomething();

Y un video de YouTube con una demostración en Administrado y no administrado; PInvocar; [ Conari vs DllExport]. Para ser honesto, la documentación está muy por debajo de la perfección, pero no dejes que eso te desanime: los videos de YouTube son excelentes.

Este proyecto está inspirado en otro proyecto de Robert Giesecke que tiene 220 000 descargas en NuGet.

Dato curioso: algunas bibliotecas de Python han usado esto para implementar la funcionalidad en una combinación de C++ y C#.

Y finalmente, gracias Robert Giesecke y Denis Kuzmin, ¡un trabajo brillante, brillante!

Agradecemos que quieras añadir valor a nuestro contenido informacional cooperando tu veteranía en las interpretaciones.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *