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

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

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

(PS:主要是考虑到性能问题,不能一个字段一个字段的拼接转换,太耗时,
问题解决了还会追加的悬赏,谢谢各位大神了。)

如果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=.....;
}

追问

我说的第二种情况就是不加const的,返回字符串数组值为空。。。。
c#代码: string[,] s = new string[6555,6555];
test(ref s);

追答void test(char ***re,int row,int col) {
 //*re=.....;
  
  for(int i=0;i<row;i++){
    for(int j=0;j<col;j++){
       strcpy(re[i],"Your Value.")
    }
  }


c#: 
   [DllImport(.....)] 
   public static extern void test(ref string[,] s);
   static void Main(..) { 
       string[,] s = new string[6555,6555]; 
       test(s,6555,6555);
   }

追问

我是这么写的,
char *eee="idsafdsafdsafsdafafdsasdfdsa";
char **result=&eee;
re = &result;
应该和你写的差不多,结果还是返回空,
有没有可能,是跳出c++后内存释放了呢?所以传地址传不过来呢?

追答

你调用C++函数时,目的是不是为了拿到字符串?

追问

对,c++取数据,这个项目需要,没法改。
我刚才又试了一下,作为返回值char*可以正常传递,二维数组和三维数据就不行,
如果作为参数,值都传不出来。

追答

下面是最终解决方案:


 直接传入二维数组是不行的,唯一的办法就是通过 扁平化数组,然后在托管代码声明处采用[In,Out]特性声明形参

还是以上面的为例:

   

[DllImport(.....)] 
 public static extern void test([In,Out][MarshalAs(UnmanagedType.LPArray,ArraySubType=UnmanagedType.LPStr,SizeParamIndex=1)] ref string[] s,...);  // 拿到值后,再赋值给二维数组。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-03-19
好吧,那你先给我解释一下三维数组怎么就相当于是c#中的datatable类型追问

一维数组char *相当于c#里的字符串,
那二维数组char**相当于c#里字符串一维数组
三维数组char***不就是相当于字符串二位数组了么,
如果不考虑类型,datatable不就是字符串的二维数组么???

是我没说明白,还是你没理解明白?

相似回答