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#.
- Usando C++/CLI como una DLL intermedia
- http://blogs.microsoft.co.il/sasha/2008/02/16/net-to-c-bridge/
- 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
- Usando COM
- http://msdn.microsoft.com/en-us/library/zsfww439.aspx
- 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
- 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
- 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.