C#调用C++动态链接库报内存错误

chenwangfeng 2012-10-14 05:30:07
C#调用C++的一个动态链接库,调用的方法有一个参数是结构体,我在C#中也声明了结构体,但是每次调用都会报尝试读取或写入受保护的内存。这通常指示其他内存已损坏。 是不是我在C#中声明的结构体与C++的结构体数据类型不一致导致的?
...全文
259 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
__天涯寻梦 2012-10-15
  • 打赏
  • 举报
回复
假设你的 NAME_LEN 和 PASSWD_LEN 没错,还有两处
char sDVRIP[16];
WORD wDVRPort;
对应
[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 16)]
public byte[] sDVRIP;
public ushort wDVRPort;
chenwangfeng 2012-10-15
  • 打赏
  • 举报
回复
那我这个C++的结构体转换应该怎么写呢?如果C++的结构体中再套结构体的数组,我的C#中应该怎么进行转换?
chenwangfeng 2012-10-15
  • 打赏
  • 举报
回复
这是我调用的海康的SDK中的方法
chenwangfeng 2012-10-15
  • 打赏
  • 举报
回复
还是不行,尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
owennol 2012-10-15
  • 打赏
  • 举报
回复
某家硬盘录像机的SDK吧:)

public int wDVRPort;
改成
public ushort wDVRPort;

其他应该都是正确的。。。
qldsrx 2012-10-14
  • 打赏
  • 举报
回复
数组不恶心,数组最高,数组万岁。

楼主转换前没有看数据类型对应,C++的char 类型,只能对应byte(单字节),C#的char是双字节的,长度就不一样了。
Yumichika 2012-10-14
  • 打赏
  • 举报
回复
这么说吧
我当年做C#调用DLL的时候就发现
最恶心的就是结构体中含有数组
理论上像LZ这么写应该是可以的 但就是不能跑...
因为C#和C++的数组结构是完全不一样的 具体怎么个不一样法儿也找不到靠谱的资料

如果可以修改C++源代码的话
比较好的方法是(也就是我当年采用的) 自己来强制规定结构体的内存分配
或者最原始的方法 把结构体转成STRING来传递
chenwangfeng 2012-10-14
  • 打赏
  • 举报
回复
自己顶顶,有没有大侠指教下啊!
chenwangfeng 2012-10-14
  • 打赏
  • 举报
回复
郁闷,代码发错了
C++的

struct{
char sDVRIP[16];
WORD wDVRPort;
BYTE byChannel;
BYTE byTransProtocol;
BYTE byTransMode;
BYTE byRes[3];
BYTE sUserName[NAME_LEN];
BYTE sPassword[PASSWD_LEN];
}NET_DVR_MATRIX_DECINFO, *LPNET_DVR_MATRIX_DECINFO;
下面是C#的 public struct NET_DVR_MATRIX_DECINFO
{
[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 16)]
public char[] sDVRIP;
public int wDVRPort;
public byte byChannel;
public byte byTransProtocol;
public byte byTransMode;
[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 3)]
public byte[] byRes;
[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 32)]
public byte[] sUserName;
[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 16)]
public byte[] sPassword;
}
这是我C#声明的,有哪里不对吗?请大侠赐教
SocketUpEx 2012-10-14
  • 打赏
  • 举报
回复
看不懂
但有一点可以肯定的是:这是两个完全不一样的结构

chenwangfeng 2012-10-14
  • 打赏
  • 举报
回复
struct{
DWORD dwSize;
NET_DVR_MATRIX_DECINFO struDecChanInfo;
DWORD dwDecState;
NET_DVR_TIME StartTime;
NET_DVR_TIME StopTime;
char sFileName[128];
}NET_DVR_MATRIX_DEC_CHAN_INFO,*LPNET_DVR_MATRIX_DEC_CHAN_INFO;
这是C++的结构体
public struct NET_DVR_MATRIX_DECINFO
{
[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 16)]
public char[] sDVRIP;
public int wDVRPort;
public byte byChannel;
public byte byTransProtocol;
public byte byTransMode;
[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 3)]
public byte[] byRes;
[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 32)]
public byte[] sUserName;
[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 16)]
public byte[] sPassword;
}
这是我C#声明的,有哪里不对吗?请大侠赐教!
SocketUpEx 2012-10-14
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
是不是我在C#中声明的结构体与C++的结构体数据类型不一致导致的?
[/Quote]

应该是的

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧