es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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>

Tags:  , ,

Answer

  1. Avatar for 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;
    }
    }


    Código de C#: ```c# using System; using System.Runtime.InteropServices; namespace CallingCppFromCSharp { class Program { [DllImport("MyCppLibrary.dll")] public static extern int add(int a, int b); static void Main(string[] args) { int result = add(1, 2); Console.WriteLine("El resultado de add(1, 2) es {0}", result); } } }

    En este ejemplo, la función add en C++ se expone utilizando extern "C" y __declspec(dllexport). En C#, se utiliza el atributo DllImport 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.

Comments are closed.