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))这样子来取得整个结构体的实际大小.
你觉得可能么?