gpt4 book ai didi

c# - ICustomMarshaler 变长数组

转载 作者:行者123 更新时间:2023-11-30 18:40:41 25 4
gpt4 key购买 nike

我知道可以使用数组的索引来指定编码 C 数组的数组长度。不过,我想做一些不同的事情。

我希望大小是一个带前缀的 Int16。如果我将它作为数组的一个条目,我将无法控制计数说明符的编码(marshal)大小。

因此,简而言之,我如何编写一个自定义编码器,将 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;
}

在 native 端,这将显示为

struct
{
short count;
int[] Item;
}

但由于托管端的每个可变长度数组都会执行此操作,因此我希望自定义编码器为我附加计数。

问题是

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

最佳答案

我要说的是……自定义编码(marshal)拆收器感觉有点矫枉过正。如果您真的想使用自定义编码(marshal)拆收器执行此操作,您将不得不使用 unsafe block /方法和指针数学来写入数据。

为什么不使用类似于您的原生结构的类,并在编码(marshal)处理时将您的数组包装在其中?真的,无论如何你都在试图传递一个结构;自定义编码器的唯一原因是从数组中神奇地生成该结构。最好避免魔术,IMO,同时让默认编码器完成繁重的工作。

关于c# - ICustomMarshaler 变长数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7855352/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com