本人通过c++取得数据量比较大的数据,类型是char***三维数组,
就相当于是c#中的datatable类型,现在希望将char的三维数组传给c#,并转换成datatable使用。
请问各位大神,
1、c++的接口该如何做
2、c#又该如何接收
3、以及c#接收后如何转换成datatable
(PS:主要是考虑到性能问题,不能一个字段一个字段的拼接转换,太耗时,
问题解决了还会追加的悬赏,谢谢各位大神了。)
如果C++的形参是char***三级指针的话,我建议你使用C#的string[][] str即二维数组来进行虚实结合。
比如,C++ API原型如下:
extern "C"{则,在托管C#里调用(声明部分)就应该是:
至于你所说的转换成DataTable,没见过有这样的调法。 不过我通常的做法是将C++ API原型的形参采用二级指针,形如char **,然后再托管C#里采用一维数组。
追问c++的参数必须用const么?我加const的话,在函数内部就无法赋值,不加的话c++侧都能取到值,但c#层接收的返回值s为空,代码在评论里。和你的代码唯一的区别就在const上,对c++不是很了解,这里const char ***要怎么赋值,直接赋值好像不允许,请赐教,谢谢。
追答我上面的代码只是个demo,实际加不加是根据你具体的需要。
const char *** :是指向常量的指针 类型为char,指向的地址可以改变,但值不能改变。
你试下这样改:
void test(char ***re) {
*re=.....;
}
我说的第二种情况就是不加const的,返回字符串数组值为空。。。。
c#代码: string[,] s = new string[6555,6555];
test(ref s);
我是这么写的,
char *eee="idsafdsafdsafsdafafdsasdfdsa";
char **result=&eee;
re = &result;
应该和你写的差不多,结果还是返回空,
有没有可能,是跳出c++后内存释放了呢?所以传地址传不过来呢?
你调用C++函数时,目的是不是为了拿到字符串?
追问对,c++取数据,这个项目需要,没法改。
我刚才又试了一下,作为返回值char*可以正常传递,二维数组和三维数据就不行,
如果作为参数,值都传不出来。
下面是最终解决方案:
直接传入二维数组是不行的,唯一的办法就是通过 扁平化数组,然后在托管代码声明处采用[In,Out]特性声明形参
还是以上面的为例:
[DllImport(.....)]
一维数组char *相当于c#里的字符串,
那二维数组char**相当于c#里字符串一维数组
三维数组char***不就是相当于字符串二位数组了么,
如果不考虑类型,datatable不就是字符串的二维数组么???
是我没说明白,还是你没理解明白?