你所指的IntPtr指针是In参数,还是Out参数

解决方案 »

  1.   

    http://topic.csdn.net/u/20100126/13/8bb52c6b-165e-4d32-8691-bc97f7126adc.html
      

  2.   


    应该算是in吧!我是变成要相当于c++中那种结构,通过socket发送出去的。
      

  3.   

    In参数的话,你说的不定长byte数组是不成立的,传送前,你肯定知道究竟需要多长
    应该直接new byte[Length]就可以了,另外,C++中是参数类型是什么?LPVOID,还是LPVOID* ?如果是LPVOID,那直接传就行了,如果是LPVOID* 那必须分配非托管内存了
      

  4.   

    c++ ==> PVOID
    C# ==> byte[]
      

  5.   


    我这个里面c++设计的比较特殊,没有用直接的指针,用的byte[4],直接拷贝到这里,然后前面有一个字段指定其长度,
      

  6.   


    但是byte[] 不固定长度怎么办?
      

  7.   

    你的byte[] 做为In参数,怎么会不知道长度?
      

  8.   

    以下代码示例把一个结构转换为byte数组,假定要被转换的结构是Int32,代码如下:
     int   n = 65535;            IntPtr p = Marshal.AllocHGlobal(Marshal.SizeOf(n));
               
                Marshal.StructureToPtr(n, p, true);
                byte[] bytes = new byte[Marshal.SizeOf(n)];
                for (int i = 0, lpByte = p.ToInt32(); i < Marshal.SizeOf(n); i++, lpByte++)
                {
                    bytes[i] =(byte) Marshal.PtrToStructure((IntPtr)lpByte, typeof(byte));
                }
                Marshal.DestroyStructure(p,typeof(int));
                Marshal.FreeHGlobal(p);
    此时的bytes是Int32 n的byte数组
      

  9.   

      CD msgToSend = new CD();
               ...
              IntPtr MsgToSendbuffer = Marshal.AllocCoTaskMem(msgToSendLen);          Marshal.StructureToPtr(msgToSend, MsgToSendbuffer, false);          byte[] byteToSend = new byte[msgToSendLen];          Marshal.Copy(MsgToSendbuffer, byteToSend, 0, msgToSendHeadLen);把struct变成byte[]通过这个就可以实现了。
     我的问题是我的这个struct中有一个指针,每次指向都是不固定长度的另一个结构,我如何序列化。我现在已经通过把每个结构变成byte[],然后再把数组按顺序接起来实现了,但我还是想了解有没有更好的方法。