char recbuf[4096] 这个是VC代码我要把他转换成C#代码我用C#尝试了很多类型都解决了不这个问题,如 string[],char[],ushort[],uint[],ulong都不行希望高手能出现,急!

解决方案 »

  1.   

    byte[] recbuf = new byte[4096];
      

  2.   


    你这样的态度,不值得别人帮你回答问题.
    gomoku能帮你回答问题,是你的荣幸.
    你可以找一下gomoku回复的问题,他的答案基本上就是准确解答.
      

  3.   


    但是,像他那样确实不行,你知道我为什么把那些数据类型列出来吗?
    就是不想让大家重复发表一些内容。我那样说确实有点过急了一点,唉,最近搞程序有点心情烦,向你说声I'm Sorry!
      

  4.   

    明显是错误的,居然还贴出来。正确的对应是:
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 4096)]
    string recbuf;
    注意上面的属性标志,指定了一个定长的字符串。VC中的字符数组就是C#中的字符串
      

  5.   

    [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst = 60)]
    public string csharpString变量名;
      

  6.   

    我把代码贴出来:
            [DllImport("ClientDll.dll", EntryPoint = "CLIENTDLL_GetDeviceList", ExactSpelling = false, CallingConvention = CallingConvention.Winapi)]
            public static extern int CLIENTDLL_GetDeviceList(IntPtr handle, string  recvBufs, int iBuflen);调用:
          [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 4096)]
            string  recvBuf; Ret = MapGooSdk.NetWorkSdk.CLIENTDLL_GetDeviceList(hServerHandle, recvBuf, 4096);
      

  7.   

    你的VS函数原型是如何的?那个参数部分就是char recbuf[4096]吗?
    试试这种写法:[DllImport("ClientDll.dll", EntryPoint = "CLIENTDLL_GetDeviceList", ExactSpelling = false, CallingConvention = CallingConvention.Winapi)]
      public static extern int CLIENTDLL_GetDeviceList(IntPtr handle,[In, Out, MarshalAs(UnmanagedType.LPTStr, SizeConst = 4096)] string recvBufs, int iBuflen);如果你的recvBufs不需要输入,只要输出,可以把“In”标志去掉
      

  8.   

    你再试试UnmanagedType.LPStr和UnmanagedType.LPWStr,总之方式应该就是那样的,注意IN、OUT标志,另外还有UnmanagedType.LPArray,是用在数组上的,你可以在char[]上使用它,例如:
    [DllImport("ClientDll.dll", EntryPoint = "CLIENTDLL_GetDeviceList", ExactSpelling = false, CallingConvention = CallingConvention.Winapi)]
    public static extern int CLIENTDLL_GetDeviceList(IntPtr handle,[In, Out, MarshalAs(UnmanagedType.LPArray, SizeConst = 4096)] char[] recvBufs, int iBuflen);
    总之,指定长度是必须的,也只有通过那个方式来在函数参数中指定,至于数据类型就这些了,你一个个试试吧。
      

  9.   

    你没看到那个是定长数组吗?如果是指针,我肯定想到StringBuilder,但是既然是定长数组,就需要先开辟一个定长空间,这时就不能用StringBuilder了。
    另外不知道[In, Out, MarshalAs(UnmanagedType.LPTStr, SizeConst = 4096)] ref string recvBufs行不行(加个ref关键字试试),反正我没测试环境,我只能给你各种可能的方式测试。
      

  10.   

    貌似在进行硬盘录像机的开发,在封装DLL?
    如果是加群104852006  群空间有个CLRInsideOut.rar工具,专门从c++库转c#代码的工具
    进群提我的ID好用