WCHAR wszName[128][256];
怎么托管?

解决方案 »

  1.   

    就是我现在要调用一个C++的dll,里面有个struct的一个数据结构是WCHAR wszName[128][256];
    我要在C#中调用的话,必须先托管,但是我不清楚这样的结构该怎么写...
    试了好多次都不行
      

  2.   

    [MarshalAs(UnamangedType.LPArray, SizeConst = 128, ArraySubType=UnmanagedType.LPStr)]
      

  3.   

    用这个试试:
    [MarshalAs(UnmangedType.ByValArray, SizeConst = 128, ArraySubType=UnmanagedType.LPWStr)]
    string[] wszName;注意:你的字符集应该是unicode方式。
      

  4.   

    感谢回复,的确是unicode方式,不过还是不对额..
      

  5.   

    提供个思路:C++那边做些技术出来,把WCHAR wszName[128][256]直接放到函数参数中,
    C#这边声明,给个例子:int TestArrayOfStrings(char** ppStrArray, int size);public static extern int TestArrayOfStrings( [In, Out] 
          String[] stringArray, int size );
      

  6.   

    dll如果是第三方的,你可以包一层dll嘛;如果是你自己写的,那直接在原来的动态库多加一个导出函数而已!
      

  7.   

    我写的测试例子:struct CC
    {
    int id; WCHAR ss[128][256];
    };extern "C" void __declspec(dllexport) TestCC(int id,WCHAR ss[128][256]);[DllImport("ExamDll.dll", EntryPoint = "TestcCC",CharSet = CharSet.Unicode)]
    public static unsafe extern void TestCC(char[,] rr);private unsafe void button2_Click(object sender, EventArgs e)
            {
                char[,] rr= new char[128,256];
                rr[0, 0] = '1';
                TestCC(rr);
            }
    不知道这样对楼主是否有帮助。。
      

  8.   

    对哦,2维数组也不过使个结构问题,实际过来是一个string的,长度方面,这按照2维数据来定,直接这个数据结构怕是传不过来,要到C#这边后再做处理吧
      

  9.   

    感谢sdl2005lyx这么热心,今天太晚了,明天我再看看...
      

  10.   

    怎么说呢,因为现在程序还是测试阶段,dll随时还可能更改,如果我包一层dll的话,今后不容易维护.
    所以尽量还是想办法在C#里进行操作.
      

  11.   

    楼主,如果你非要这样,也只有最后一招了:用IntPtr
      

  12.   

    总算解决了,感谢大家的帮助.
    最后解决方式如下:
    第一步,托管WCHAR[256]
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
        public struct STR   
        {
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
            public string name;
        }然后再托管WCHAR[128[256]
        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
        public struct Item
        {
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
            public STR[] name;
        }分两步走就可以了~