关于C#调用非托管C++dll传参问题(C#、C++高手进)

本人通过c++取得数据量比较大的数据,类型是char***三维数组,就相当于是c#中的datatable类型,现在希望将char的三维数组传给c#,并转换成datatab... 本人通过c++取得数据量比较大的数据,类型是char***三维数组,
就相当于是c#中的datatable类型,现在希望将char的三维数组传给c#,并转换成datatable使用。

请问各位大神,
1、c++的接口该如何做
2、c#又该如何接收
3、以及c#接收后如何转换成datatable

(PS:主要是考虑到性能问题,不能一个字段一个字段的拼接转换,太耗时,
问题解决了还会追加的悬赏,谢谢各位大神了。)
展开
 我来答
仙戈雅3n
推荐于2016-05-15 · TA获得超过5790个赞
知道大有可为答主
回答量:2398
采纳率:75%
帮助的人:885万
展开全部

如果C++的形参是char***三级指针的话,我建议你使用C#的string[][] str即二维数组来进行虚实结合。


比如,C++ API原型如下:

extern "C"{
_declspec(dllexport) void _demo(const char ***s){
    // 此处省略...
}
}

则,在托管C#里调用(声明部分)就应该是:

[DllImport("你的动态链接库名称.dll", CallingConvention = CallingConvention.Cdecl)]
 public static extern void _demo(string[][] s);


至于你所说的转换成DataTable,没见过有这样的调法。 不过我通常的做法是将C++ API原型的形参采用二级指针,形如char **,然后再托管C#里采用一维数组。

更多追问追答
追问
c++的参数必须用const么?我加const的话,在函数内部就无法赋值,不加的话c++侧都能取到值,但c#层接收的返回值s为空,代码在评论里。和你的代码唯一的区别就在const上,对c++不是很了解,这里const char ***要怎么赋值,直接赋值好像不允许,请赐教,谢谢。
追答
我上面的代码只是个demo,实际加不加是根据你具体的需要。
const char *** :是指向常量的指针 类型为char,指向的地址可以改变,但值不能改变。

你试下这样改:
void test(char ***re) {
*re=.....;
}
开竿鲶鱼
2015-03-19 · 超过26用户采纳过TA的回答
知道答主
回答量:61
采纳率:100%
帮助的人:21万
展开全部
好吧,那你先给我解释一下三维数组怎么就相当于是c#中的datatable类型
追问
一维数组char *相当于c#里的字符串,
那二维数组char**相当于c#里字符串一维数组
三维数组char***不就是相当于字符串二位数组了么,
如果不考虑类型,datatable不就是字符串的二维数组么???

是我没说明白,还是你没理解明白?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式