日期:2014-05-19  浏览次数:21059 次

C#结构体中非托管代码的定义及使用,在线等答案
现在有个结构体,结构体的定义中包含另一个结构体数组,这个结构体数组的具体长度在定义时无法知道.
        [StructLayout(LayoutKind.Sequential,   Pack   =   1)]
        public   struct   _tagBase
        {
                //这个结构体中包含的结构体数组长度.
                public   byte   Count;
                [MarshalAs(UnmanagedType.SafeArray/*这里的类型要选择哪个呢?具体有UnmanagedType.LpStruct,   UnmanagedType.LpArray,至于后面的子项是根据前面你选择的类型来定的.比如我现在选择SafeArray,就有*/   SafeArrayUserDefinedSubType   =   /*这里我填_tagInSide时编译不通过,提示_tagInside类型在这当作变量使用*/)]
                public   _tagParameter[]   Parameters;
        }

        [StructLayout(LayoutKind.Sequential,   Pack   =   1)]
        public   struct   _tagInSide  
        {
                [MarshalAs(UnmanagedType.ByValArray,   SizeConst   =   4)]
                public   byte[]   ParamType;
                public   int   Value;

        };

问题在于,如果按上面的定义后,怎么在运行时得知整个_tagBase结构体的实际长度.代码如下:
_tagBase   base   =   new   _tagBase();
_tagInSide[]   inside   =   new   _tagInSide[1];
base.Count   =   inside.Count;
int   StructSize   =   Marshal.SizeOf(typeof(_tagBase));
StructSize得到的值为5,这样的定义Marshal.Sizeof()取到的是第二个结构体的地址作而不是取其内容.我想得到的是9.请问如何实现如此类结构体的定义及长度的取得.如有不明的地方请大家指点.我再详细描述下.

------解决方案--------------------
Mark
------解决方案--------------------
public _tagInSide[] Parameters;//这里定义时无法指定到底要多少个_tagInSide.因为我在实际应用时的个数是不一定的.但又需要在运行时能通过Marshal.SizeOf(typeof(_tagBase))这样子来取得整个结构体的实际大小.


你觉得可能么?