当前位置:编程学习 > C#/ASP.NET >>

关于封送的问题

因为对c#不太熟悉的原因,项目设计之初不了解c#与c++通信需要封送的关系,故c++设计中没有考虑方便c#的封送。导致目前出现如下问题:
  

       c++结构中有定义一个指针,每次指向另一个不同的结构。被指向的多个结构长度不等。所以目前c#封送亦需要对一个包含不定长的数组结构进行封送。不知道如何实现? 
       
       我在C#结构中也尝试定义一个IntPtr指针,并且将需要指向的结构的内容通过StructureToPtr函数,赋在此指针下,但是封送的时候只封送IntPtr指针,并不封送具体内容。

       故我想如果将IntPtr指针换成一个不定长byte数组,每次将需要封装的结构转成byte数组,再进行封送应该可以实现。但是却不知道如何能够封送不定长数组
   
                                                                                 请指教!
--------------------编程问答-------------------- 只能帮你顶了!!! --------------------编程问答-------------------- --------------------编程问答-------------------- 你所指的IntPtr指针是In参数,还是Out参数 --------------------编程问答--------------------
引用 2 楼 happyrain2010 的回复:
顶下吧

out --------------------编程问答--------------------
引用 3 楼 jointan 的回复:
你所指的IntPtr指针是In参数,还是Out参数

呵呵 --------------------编程问答-------------------- http://topic.csdn.net/u/20100126/13/8bb52c6b-165e-4d32-8691-bc97f7126adc.html --------------------编程问答--------------------
引用 3 楼 jointan 的回复:
你所指的IntPtr指针是In参数,还是Out参数


应该算是in吧!我是变成要相当于c++中那种结构,通过socket发送出去的。
--------------------编程问答-------------------- In参数的话,你说的不定长byte数组是不成立的,传送前,你肯定知道究竟需要多长
应该直接new byte[Length]就可以了,

另外,C++中是参数类型是什么?LPVOID,还是LPVOID* ?

如果是LPVOID,那直接传就行了,如果是LPVOID* 那必须分配非托管内存了 --------------------编程问答-------------------- c++ ==> PVOID
C# ==> byte[] --------------------编程问答--------------------
引用 8 楼 jointan 的回复:
In参数的话,你说的不定长byte数组是不成立的,传送前,你肯定知道究竟需要多长
应该直接new byte[Length]就可以了,

另外,C++中是参数类型是什么?LPVOID,还是LPVOID* ?

如果是LPVOID,那直接传就行了,如果是LPVOID* 那必须分配非托管内存了


我这个里面c++设计的比较特殊,没有用直接的指针,用的byte[4],直接拷贝到这里,然后前面有一个字段指定其长度, --------------------编程问答--------------------
引用 9 楼 bloodish 的回复:
c++ ==> PVOID
C# ==> byte[]


但是byte[] 不固定长度怎么办? --------------------编程问答-------------------- 你的byte[] 做为In参数,怎么会不知道长度? --------------------编程问答-------------------- 以下代码示例把一个结构转换为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数组 --------------------编程问答--------------------
  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[],然后再把数组按顺序接起来实现了,但我还是想了解有没有更好的方法。
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,