社区
C#
帖子详情
C#调用C++动态链接库报内存错误
chenwangfeng
2012-10-14 05:30:07
C#调用C++的一个动态链接库,调用的方法有一个参数是结构体,我在C#中也声明了结构体,但是每次调用都会报尝试读取或写入受保护的内存。这通常指示其他内存已损坏。 是不是我在C#中声明的结构体与C++的结构体数据类型不一致导致的?
...全文
274
12
打赏
收藏
C#调用C++动态链接库报内存错误
C#调用C++的一个动态链接库,调用的方法有一个参数是结构体,我在C#中也声明了结构体,但是每次调用都会报尝试读取或写入受保护的内存。这通常指示其他内存已损坏。 是不是我在C#中声明的结构体与C++的结构体数据类型不一致导致的?
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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]
应该是的
C++
调用
C#
的DLL实例程序
本示例探讨了如何使用
C++
调用
由
C#
编写的DLL
动态链接库
。
C++
与
C#
是两种不同的编程语言,它们有着各自的优势,但在某些情况下,可能需要结合两者的能力。下面将详细介绍这个过程,并解释相关知识点。 首先,我们要...
C#
调用
C/
C++
Dll中函数实例代码
在.NET框架中,
C#
作为高级编程语言,与C或
C++
编译的
动态链接库
(DLL)交互是常见的需求。这种交互主要通过平台
调用
服务(Platform Invoke, P/Invoke)来实现,使得托管代码(如
C#
)能够
调用
非托管代码(如C/
C++
的DLL)...
AutoCAD二次开发文档(
C++
C#
史上最全版本)
扫描版.pdf"可能是本书的电子版,它深入讲解了如何使用
C#
和.NET Framework进行AutoCAD的二次开发,包括创建
动态链接库
(DLL)、实现自定义命令和对象等。 3. **ObjectARX实例教程**: "ObjectARX开发实例教程...
C#
禁止结束进程,保护进程不被结束(源代码)
C#
,保护进程,通过VisualStudio.NET2005平台,控制系统不能结束自身进程,控制系统不能结束指定进程,已经生成了一个
动态链接库
,方便
调用
,(
C#
工程源代码),具体内容访问:...
zlib.h+zconf.h+zlib.lib+zlib1.dll
4. **zlib1.dll**:这是ZLib的
动态链接库
文件,通常在运行时被应用程序
调用
。如果你的程序使用了动态链接,那么需要将此DLL文件与可执行文件一起分发,否则程序可能无法正常运行。 标签中的"zlib dll lib"分别对应...
C#
111,098
社区成员
642,554
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章