在托管代码中使用非托管函数给出错误:尝试读取或写入受保护的内存

时间:2015-07-02 07:51:43

标签: c# c++

我正在尝试在我的c#项目中使用c ++ dll方法,其中一个方法工作正常但其他人正在给出错误:尝试读取或写入受保护的内存。这通常表明其他内存已损坏。 我不知道背后的原因。 enter image description here

enter image description here

1 个答案:

答案 0 :(得分:0)

我的纯粹猜测:

在C ++中,long与C#不同。如果你的C ++函数的参数是longunsigned long,那么在C#中你应该分别使用intuint

我想这就是问题所在,因为对C#/long使用client port非常奇怪。你不需要64位数。如果签名不匹配,那么第三个搅拌参数response在编组时会被破坏,而C ++端会在那里得到一个无效指针。

您当前的C#实现对应于此C ++签名:

long FK_SendResponse(string addr, long port, string response);
//<->
int64 FK_SendResponse(char const* addr, int64 port, char* response)

我猜你想要使用:

/*C#*/ int FK_SendResponse(string addr, int port, string response);
//<->
/*C++*/ long FK_SendResponse(char const* addr, long port, char* response)

/*C#*/ uint FK_SendResponse(string addr, uint port, string response);
//<->
/*C++*/ unsigned long FK_SendResponse(char* addr, unsigned long port, char* response)
// (or, the same speaking with WINAPI types)
/*C++*/ HRESULT FK_SendResponse(LPSTR addr, DWORD port, LPSTR response)