社区
C#
帖子详情
C#调用C++动态链接库报内存错误
chenwangfeng
2012-10-14 05:30:07
C#调用C++的一个动态链接库,调用的方法有一个参数是结构体,我在C#中也声明了结构体,但是每次调用都会报尝试读取或写入受保护的内存。这通常指示其他内存已损坏。 是不是我在C#中声明的结构体与C++的结构体数据类型不一致导致的?
...全文
259
12
打赏
收藏
C#调用C++动态链接库报内存错误
C#调用C++的一个动态链接库,调用的方法有一个参数是结构体,我在C#中也声明了结构体,但是每次调用都会报尝试读取或写入受保护的内存。这通常指示其他内存已损坏。 是不是我在C#中声明的结构体与C++的结构体数据类型不一致导致的?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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 由于公司很多底层的SDK,都是
C++
开发,上层的应用软件却是
C#
Winform程序。在实际工作的过程中,就经常碰到了
C#
程序
调用
C++
动态库的问题。最近一直在和
C++
打交道,
C#
怎么
调用
C++
类库...
C#
调用
C++
动态链接库
方法介绍
当VC等
调用
C#
写的COM时,用...下面介绍
C#
调用
C++
动态链接库
方法。 添加System.Runtime.InteropServices命名空间 如是COM就直接用静态函数
调用
: public static int GetNum( int lFileSeqNo, string sExtType, string
C#
调用
C++
动态链接库
Dll以及联调
C#
调用
C++
动态链接库
Dll以及联调 平:很好用,已经使用过了。可以联调。 1:
C++
对外公开的接口需声明为: extern “C” __declspec Fun(); 这是由于
c++
与
c#
调用
方式不一样,所以函数前需要加__stdcall修饰; 2:
c#
...
关于
C#
调用
C++
动态链接库
C#
C++
联合开发:
动态链接库
C#
调用
C++
动态库
1.创建一个
C++
动态链接库
项目。 2.声明方法 下面分别举例了无入参和有入参的函数。其中有入参的函数列举了int、char* 、和结构体。 #include "stdafx.h"using namespace std;#include<iostream>//无参数...
C#
110,533
社区成员
642,574
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章