Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ICustomMarshaler可变长度数组_C#_Marshalling - Fatal编程技术网

C# ICustomMarshaler可变长度数组

C# ICustomMarshaler可变长度数组,c#,marshalling,C#,Marshalling,我知道可以使用数组索引来指定封送C数组的数组长度。然而,我想做一点不同 我希望大小为前缀为Int16。如果将其作为数组的一个条目,则无法控制计数说明符的封送大小 那么,简而言之,我如何编写一个以Int16作为计数前缀的自定义封送拆收器呢 请注意,我必须序列化数据,因此不允许使用INTPTR 我遇到的难题是如何实现GetNativeDataSize。我当时没有IntPtr或托管对象,因此如何编组Int16以获得计数 比如说 [StructLayout(LayoutKind.Sequential,

我知道可以使用数组索引来指定封送C数组的数组长度。然而,我想做一点不同

我希望大小为前缀为Int16。如果将其作为数组的一个条目,则无法控制计数说明符的封送大小

那么,简而言之,我如何编写一个以Int16作为计数前缀的自定义封送拆收器呢

请注意,我必须序列化数据,因此不允许使用INTPTR

我遇到的难题是如何实现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;
}
在本机端,这将显示为

struct
{
    short count;
    int[] Item;
}
但由于托管端的每个可变长度数组都会这样做,所以我希望自定义封送拆收器为我附加计数

问题是

  • 我不知道GetNativeDataSize应该做什么,或者它将如何工作,因为我没有任何对本机数据的引用
  • 我不能依赖LPArray,因为计数必须是Int16
  • 数组项是否正确封送,或者数组自定义封送器是否隐藏了项封送器,或者我是否必须实现一些通用封送器(如果可能的话)

我要说的是……一个定制的封送员感觉太过分了。如果您真的想使用自定义封送拆收器执行此操作,则必须使用
unsafe
块/方法和指针数学来写入数据


为什么不创建一个类似于本机结构的类,并在封送处理时将数组封装在其中?实际上,你无论如何都在试图通过一个结构;自定义封送拆收器的唯一原因是从数组神奇地生成该结构。IMO,最好避免这种魔力,同时让默认封送拆收器完成繁重的工作。

问题是,使用可变长度数组时,还没有解决反序列化问题。现在我们回到了第一步,仍然没有答案。@Xaade:对于大多数数组,您将遇到一些重大问题。自定义封送拆收器的
GetNativeDataSize
方法不会获得指向数据的指针(因为它还没有被复制,因为运行时需要知道要复制多少),所以最好指定最大值(32768*sizeof(int),记住大多数C编译器都会将填充插入到dword align int)。如果数组接近堆栈的底部或堆的顶部,则很容易中断。您需要与本机代码进行一些合作才能获得大小。我刚刚编写了一个完整的自定义序列化程序类。这个东西可以处理从动态数组到字符串等所有内容。封送还不够好。@cHao,
GetNativeDataSize
只是为了帮助GC知道您的内存“压力”有多大。您可以安全地从MS返回-1,如本例中所示:的可能重复项