从c#调用带有函数指针的cpp外部函数会引发System.AccessViolationException

从c#调用带有函数指针的cpp外部函数会引发System.AccessViolationException,c#,c++,C#,C++,我有一个cpp程序,它有两个函数指针作为参数,然后调用第三方dll。我需要从我的c#中调用它。但在运行时,我得到了error System.AccessViolationException' 我的c#代码是 我的cpp方法是 extern "C" __declspec(dllexport) void APIInit2(event_cb evt, heartbeat_cb hbEvt) { std::cout << "Success call"; HINSTANCE

我有一个cpp程序,它有两个函数指针作为参数,然后调用第三方dll。我需要从我的c#中调用它。但在运行时,我得到了error System.AccessViolationException'

我的c#代码是

我的cpp方法是

extern "C" __declspec(dllexport) void APIInit2(event_cb evt, heartbeat_cb hbEvt)
{
    std::cout << "Success call";

    HINSTANCE hGetProcIDDLL = LoadLibrary(L"MyAPI.dll");
    FARPROC lpfnGetProcessID = GetProcAddress(HMODULE(hGetProcIDDLL), "init");
    initFunc initFn = initFunc(lpfnGetProcessID);

    initFn(serviceId, fsaAddress.c_str(), port, evt, hbEvt);
}
心跳_值的定义是

typedef void(__stdcall* heartbeat_cb)(unsigned int heartbeat_value);

好的,那么哪一行代码引发异常呢?如果我注释行initFn(serviceId,fsaAddress.c_str(),port,evt,hbEvt);它调用成功。这能给你什么提示吗?这里的活动部件太多了。可能是
MyAPI.dll
中的
init
没有与
initFunc
匹配的签名。可能是
fsaaaddress
无效,
port
无效,
evt
无效,
hbEvt
无效,
LoadLibrary
失败或
GetProcAddress
失败。。。您必须在这里进行一些调试以缩小原因。在调用LoadLibrary后,GetLastError中出现错误193。
typedef void(__stdcall* event_cb)(int service_id, event_id_t event_id
typedef void(__stdcall* heartbeat_cb)(unsigned int heartbeat_value);