【发布时间】:2011-10-21 21:15:54
【问题描述】:
我知道可以使用数组中的索引来指定编组 C 数组的数组长度。不过,我想做点不一样的。
我希望大小为前缀 Int16。如果我将它作为数组的条目,我将无法控制计数说明符的封送大小。
所以,简而言之,我如何编写一个自定义编组器,将 Int16 作为计数作为前缀。
请注意,我必须对数据进行序列化,所以不允许使用 IntPtrs。
我被难住的部分是如何实现 GetNativeDataSize。那时我没有 IntPtr 或托管对象,那么我将如何编组 Int16 来获得计数。
例如。
[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Ansi)]
class Something
{
[MarshalAs(UnmanagedType.CustomMarshaler ... ]
public ArrayItem[];
}
还有其他类
[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Ansi)]
class ArrayItem
{
public int Item;
}
在 Native 端,这会显示为
struct
{
short count;
int[] Item;
}
但是由于托管端的每个可变长度数组都会执行此操作,因此我想要一个自定义编组器来为我附加计数。
问题是
- 我不知道 GetNativeDataSize 应该做什么,也不知道它是如何工作的,因为我没有对本机数据的任何引用。
- 我不能依赖 LPArray,因为计数必须是 Int16
- 数组项是否正确编组,或者数组自定义编组器是否隐藏项编组器,或者我将不得不实现一些通用编组器(如果可能的话)。
【问题讨论】:
标签: c# marshalling