如何从C ++ DLL项目中调用C#项目函数

时间:2018-06-25 07:06:24

标签: c# c++

我有两个项目,分别命名为CPPDLLProject和CSharpProject。

在CPPDLLProject中,可以从CSharpProject调用的dllexport函数很少,并且该调用工作正常。

但是在这里我想从CPPDLLProject调用CSharpProject的函数,以便可以将数据从C ++ DLL传播到C#项目。

仅出于更多说明,想添加以下代码示例。 下面是要从中调用C#函数的C ++ DLL中的函数。

void __stdcall CPPDLLApp::PumpMessageData(int aCode, int aType)
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState());

    if (aCode == PUMP_UPDATE_MSG && aData != NULL)
    {
        switch (aType)
        {
            case MSG_ADD:
            {
                // Call the C# function to send the added msg to C# project
                GetCPPDLLAppMsg("MSG added");
                break;
            }
            case MSG_DELETE:
            {
                // Call the C# function to send the deleted msg to C# project
                GetCPPDLLAppMsg("MSG deleted");
                break;
            }
            case MSG_UPDATE:
            {
                // Call the C# function to send the updated msg to C# project
                GetCPPDLLAppMsg("MSG updated");
                break;
            }
        }
    }

    if (aCode == PUMP_STOP_MSG)
    {
        // Call the C# function to send the stop msg to C# project
        break;
    }

    if (aCode == PUMP_START_MSG)
    {
        // Call the C# function to send the start msg to C# project
        break;
    }
}

下面是C#项目的功能。

public void GetCPPDLLAppMsg(string aMessage)
{
    Console.WriteLine(aMessage);
}

请提出如何实现此目标的建议。

我很少进行谷歌搜索,但是没有运气。 我的问题可能不清楚,但可以提供任何帮助。

1 个答案:

答案 0 :(得分:0)

我不太了解您的问题,但是您可以使用中间dll和以下C ++方法:

    void *p = (void *)wglGetProcAddress(name);
    if (p == 0 ||
        (p == (void*)0x1) || (p == (void*)0x2) || (p == (void*)0x3) ||
        (p == (void*)-1))
    {
        HMODULE module = LoadLibraryA("dllname.dll");
        p = (void *)GetProcAddress(module, name);
    }

名称=函数名称

dllname =您的dll名称

使用此方法,您将能够加载dll并获取指向所需的所有函数的函数指针,但是您可能需要编译C#dll才能使用此功能,您可以搭建桥梁或其他东西