Cómo llamar funciones de C++ desde un proyecto de C#
He creado un proyecto de MFC en C++ y una biblioteca de clases en C#. El proyecto de MFC se compila utilizando el Common Language Runtime Support (/clr), y el proyecto de C# está incluido como referencia dentro de la aplicación MFC.
La aplicación MFC tiene una clase llamada Manage que llama a funciones de C#:
managed.h:
class Managed abstract
{
public:
static void showcswindow(CString name, CString username);
};
managed.cpp:
#include “stdafx.h”
#include “Managed.h”
#using <system.dll>
using namespace System;
using namespace ::gettingdatafromc;
void Managed::showcswindow(CString name, CString sername)
{
services::showwindow(gcnew String(name), gcnew String(sername));
}
código C#:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace gettingdatafromc
{
public static class services
{
public static void showwindow(string name, string sername)
{
string _name = name;
string _sername = sername;
}
}
}
Cuando uso Managed::showcswindow() en mi aplicación MFC, llama directamente a la función de C#, lo que me permite pasar de código C++ a código C#.
Mi pregunta es: ¿cómo puedo hacer esto en sentido contrario? Es decir, ¿cómo puedo llamar a código C++ desde C# y saltar a la ubicación de la función C++ en el archivo C++ y ejecutarla?</system.dll>
davy.ai
Para llamar a C++ desde C# y saltar a la ubicación de la función en el archivo de C++ y ejecutarla, puedes usar Platform Invoke (P/Invoke).
Primero, debes agregar la función de C++ a tu proyecto y marcarla con la palabra clave
extern "C"
para asegurarte de que se exporte con las convenciones de llamada de estilo C. También necesitas especificar la palabra clave__declspec(dllexport)
para indicar que la función es parte de la tabla de exportación de la DLL.A continuación, debes definir la firma de la función en C# utilizando el atributo
DllImport
.Aquí tienes un ejemplo de cómo lograrlo:
Código de C++:
“`c++
extern “C” {
__declspec(dllexport) int add(int a, int b) {
return a + b;
}
}
En este ejemplo, la función
add
en C++ se expone utilizandoextern "C"
y__declspec(dllexport)
. En C#, se utiliza el atributoDllImport
para definir la firma de la función de C++ de manera que se pueda llamar directamente desde C#.Para llamar a la función de C++, simplemente invócala como si fuera un método normal de C#.
Ten en cuenta que debes asegurarte de que la DLL correcta esté cargada en tiempo de ejecución y que la firma de la función coincida exactamente. No hacerlo puede provocar errores o bloqueos en tiempo de ejecución.