各位好,我用C#写了个程序,要调用一个C++编写的DLL(也是我写的),我现在想让这个DLL返回个字符串的数组,请问应该怎么写啊?
在C++那端定义成 string* Getstr(); 可以吗?那在C#这边要怎么写呢?
我写了 [DllImport("D:\\Ata.dll", EntryPoint = "Getstr",CharSet = CharSet.Auto, CallingConvention =CallingConvention.StdCall)]
public unsafe static extern string[] Getstr(); 但结果报
无法封送处理“return value”: 无效的托管/非托管类型组合用public unsafe static extern string* Getstr(); 说 
无法获取托管类型(“string”)的地址和大小,或无法声明指向它的指针请问应该怎么解决啊?谢谢了!

解决方案 »

  1.   

    我想看你的DLL里面的C/C++代码, DLL应该以输出C stdcall的函数为准, 其他形式的接口似乎是不可以调用的。
      

  2.   

    其实代码还没完全定,但要求是要返回个string的数组。或者char的两维数组也可以。
      

  3.   

    c++的dll是做的二次开发,只支持C++....
      

  4.   

    简单层面上讲 C++里数组和指针可以替换的,你在C++里函数返回类型改成 string[] 试下。
      

  5.   

    是    string[] Getstr();吗?
    报语法错误。
      

  6.   

    用输出参数,或用stringbuilder(在调用声明里)
      

  7.   

    我在C#定义那用了  [DllImport("D:\\Add_to_assembly\\Debug\\Ata.dll", EntryPoint = "Get_bom",CharSet =CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
    public static extern StringBuilder Getstr(); 返回的好象是个数组,但StringBuilder pt;
    pt = RefComm.Getstr();
    MessageBox.Show(pt[0].ToString());打出的是乱码,我以前没有用过StringBuilder ,不好意思。。
      

  8.   

    你要把数组的内容,拷贝到你的那个返回地址里去,他才能到stringbuilder里,你先,返回指针个指针,成功后再试一维的,在试二维的,一点一点来,应该没问题
      

  9.   

    返回到IntPtr
    然后用
    Marshal.Copy(IntPtr source,
    char[] destination,
    int startIndex,
    int length
    ) 复制出去.
    最好一行写完Marshal.Copy( Getstr() , ..... );这样写
      

  10.   

    回9楼的,对你说的,实在不是很理解。
    10楼的,用Marshal.Copy的话,必须事先知道返回的数组的大小,是吧?
      

  11.   

    回10楼的,我用了
    Marshal.Copy(RefComm.Getstr(bytes), bytes, 0, 300);
    但好象如果string[]中或一string的长度超过16,它在内存中的位置会有变化。
      

  12.   

    你先确定你的C++的代码是对的,是不是返回局部变量?是这样写的么?
    char* getstr()
    {
    char sz[32]="asduifhsdfafd";
    return sz;
    }
    要是类似这样的写法,C#用何种方式都不可能调用成功的。要成功只能说是运气
      

  13.   

    楼主要的是字符串数组,应该是LPSTR *(char**)类型,但是用返回值似乎行不同,因为无法判断数组长度
    建议楼主返回字符串,用特殊字符进行分割,C++中返回char*,封送成C#的时候直接返回string,然后进行分割得了
      

  14.   

    返回字符串数组 由参数返回SafeArray类型的VARIANT
    void GetStr(VARIANT* var);
    其中var中放一个BSTR类型的1维数组。
      

  15.   

    谢谢几位,回akirya,真不好意思,被你13楼说中了。
    这个在赶进度,就先取了个折中的办法,在C++里把字符串数组的值写到文本文件里,再让C#去读,先将就了。
      

  16.   

    其实想要返回的是一个类似 L H W
    1 10 20 25
    2 20 20 25
    3 30 20 25
    4 20 25 30的二维表,其实列数、列名、行数都不确定。