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来分配呢
展开
 我来答
危献e3
2013-08-19 · TA获得超过2053个赞
知道大有可为答主
回答量:2738
采纳率:0%
帮助的人:1958万
展开全部
首先说明, 这绝对不是一个好的传递方式, 异构程序之间的数据传输 应该尽可能的以简单且文档化数据结构进行, 绝不应该依赖于语言特性或者平台特性。
然后 解决你这个问题其实也有很多方案,但是, 这都属于不推荐使用的范畴,我列举一种比较容易理解的
---------伪代码如下------------
[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)
就可以了
偶尔e网事
2013-08-19 · TA获得超过279个赞
知道小有建树答主
回答量:297
采纳率:0%
帮助的人:318万
展开全部
用指针。存储位置地址就可以了。
追问
应该用指针,c#中该如何使用指针呢
追答
标识为unsafe非安全代码
你看下http://www.csharpwin.com/csharpspace/8910r1980.shtml
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
abcd1236386
2013-08-19 · TA获得超过774个赞
知道小有建树答主
回答量:539
采纳率:0%
帮助的人:527万
展开全部
你两个结构体的内容肯定要一致呀,你在c++中用的是多少,肯定在c#中也应该是多少呀,这两个定义应该一致。
追问
C++中结构体数组长度是不定的
追答
谁说是不定的?不定岂不是要数组越界吗?越界可不是好玩的东西。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式