C#调用C++Dll 结构体传值问题
c++DLL函数原型:intSDK_GetDeviceList(CAMERA_INFO*pDeviceList);c++结构体:CAMERA_INFO定义:typedef...
c++ DLL 函数原型:int SDK_GetDeviceList(CAMERA_INFO* pDeviceList);
c++ 结构体:CAMERA_INFO定义:
typedef struct
{
unsigned int uiTotal; //总记录数
CAMERA_INFO_LIST stCameraInf[1]; //结构体数组初始化长度为1,遍历uiTotal来取值,
//pDeviceList->stCameraInfo[index].CameraName
}CAMERA_INFO;
typedef struct
{
string CameraID;
string CameraName;
}CAMERA_INFO_LIST
C# 声明函数:
[DllImport(@"SDK.dll", CallingConvention = CallingConvention.StdCall)]
extern static int SDK_GetDeviceList(ref CAMERA_INFO);
c# 结构体定义
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
struct CAMERA_INFO
{
public uint uiTotal;// 总记录数
[MarshalAs(UnmanagedType.ByValArray,SizeConst = 1000)]
public CAMERA_INFO_LIST[] stCameraInf;
};
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
struct CAMERA_INFO_LIST
{
string CameraID;
string CameraName;
};
c#调用C++Dll:
CAMERA_INFO info = new CAMERA_INFO();
int result = SDK_GetDeviceList(ref info);
这样调用能够取到值, [MarshalAs(UnmanagedType.ByValArray,SizeConst = 1000)]中SizeConst必须赋值,
问题是在调用之前不知道返回CAMERA_INFO_LIST数组长度是多少,使用时只能赋一个很大的数值;想问下有
没有什么方法,SizeConst不赋初始值,根据uiTotal来分配呢 展开
c++ 结构体:CAMERA_INFO定义:
typedef struct
{
unsigned int uiTotal; //总记录数
CAMERA_INFO_LIST stCameraInf[1]; //结构体数组初始化长度为1,遍历uiTotal来取值,
//pDeviceList->stCameraInfo[index].CameraName
}CAMERA_INFO;
typedef struct
{
string CameraID;
string CameraName;
}CAMERA_INFO_LIST
C# 声明函数:
[DllImport(@"SDK.dll", CallingConvention = CallingConvention.StdCall)]
extern static int SDK_GetDeviceList(ref CAMERA_INFO);
c# 结构体定义
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
struct CAMERA_INFO
{
public uint uiTotal;// 总记录数
[MarshalAs(UnmanagedType.ByValArray,SizeConst = 1000)]
public CAMERA_INFO_LIST[] stCameraInf;
};
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
struct CAMERA_INFO_LIST
{
string CameraID;
string CameraName;
};
c#调用C++Dll:
CAMERA_INFO info = new CAMERA_INFO();
int result = SDK_GetDeviceList(ref info);
这样调用能够取到值, [MarshalAs(UnmanagedType.ByValArray,SizeConst = 1000)]中SizeConst必须赋值,
问题是在调用之前不知道返回CAMERA_INFO_LIST数组长度是多少,使用时只能赋一个很大的数值;想问下有
没有什么方法,SizeConst不赋初始值,根据uiTotal来分配呢 展开
3个回答
展开全部
首先说明, 这绝对不是一个好的传递方式, 异构程序之间的数据传输 应该尽可能的以简单且文档化数据结构进行, 绝不应该依赖于语言特性或者平台特性。
然后 解决你这个问题其实也有很多方案,但是, 这都属于不推荐使用的范畴,我列举一种比较容易理解的
---------伪代码如下------------
[MarshalAs(UnmanagedType.ByValArray,SizeConst = sizeof(CAMERA_INFO_LIST))]
public CAMERA_INFO_LIST[] stCameraInf;
----------------------------------------
unsafe 取CAMERA_INFO_LIST的地址
---------伪代码如下------------
unsafe{ CAMERA_INFO_LIST* ptr = &sct.stCameraInf;
正常遍历 .
.....................
}
----------------------------------------
然后 解决你这个问题其实也有很多方案,但是, 这都属于不推荐使用的范畴,我列举一种比较容易理解的
---------伪代码如下------------
[MarshalAs(UnmanagedType.ByValArray,SizeConst = sizeof(CAMERA_INFO_LIST))]
public CAMERA_INFO_LIST[] stCameraInf;
----------------------------------------
unsafe 取CAMERA_INFO_LIST的地址
---------伪代码如下------------
unsafe{ CAMERA_INFO_LIST* ptr = &sct.stCameraInf;
正常遍历 .
.....................
}
----------------------------------------
追问
[MarshalAs(UnmanagedType.ByValArray,SizeConst = sizeof(CAMERA_INFO_LIST))]
这个编译不过,我改为SizeConst = Marshal.SizeOf(typeof(CAMERA_INFO_LIST)),编译出错,SizeConst必须为常量
追答
我晕。。。我说了那是伪代码 我只是举个例子 这个sizeof你自己手工是可以计算出来的。。。
只要这个数字大于sizeof(CAMERA_INFO_LIST)
就可以了
展开全部
用指针。存储位置地址就可以了。
追问
应该用指针,c#中该如何使用指针呢
追答
标识为unsafe非安全代码
你看下http://www.csharpwin.com/csharpspace/8910r1980.shtml
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你两个结构体的内容肯定要一致呀,你在c++中用的是多少,肯定在c#中也应该是多少呀,这两个定义应该一致。
追问
C++中结构体数组长度是不定的
追答
谁说是不定的?不定岂不是要数组越界吗?越界可不是好玩的东西。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询