c# - 如何编码包含指向未知类型的 C 样式数组的第一个元素的指针的结构

标签 c# .net pinvoke marshalling

我正在尝试从 C++ 编码到 C# 一个看起来像这样的结构:

typedef struct FooStruct {
    Uint8 bytesPerThingie;
    void *arrayOfThingies;
    // other members ...
}

因此,在这种情况下有两个未知数:

  1. 数组中元素的数量。
  2. 每个元素的大小(以字节为单位)。

我之前已经成功编码了结构本身,定义如下:

[StructLayout(LayoutKind.Sequential)]
public struct FooStruct {
    public byte bytesPerThingie;
    public IntPtr arrayOfThingies;
    // other members...
}

但现在我需要检查和修改嵌入式数组。

我明白了

  1. 就其本身而言,一个可blittable类型的可blittable元素数组是 本身可 blittable,但当它用作 结构。
  2. 从非托管代码编码(marshal)至 .NET Framework 时,数组长度为 根据 SizeConst 参数确定,可选地后跟非托管类型 数组元素的一部分,如果它们不可 blittable。

即使假设在这种情况下数组中的元素是 blittable 类型,如果我直到运行时才知道数组的大小,我如何设置编译时参数 SizeConst?

最佳答案

长话短说,你不能。 SizeConst fieldMarshalAsAttribute class 上被编译到现场的元数据中,并且不能在运行时更改(至少,不会以对您有利的方式)。

也就是说,您有以下选择:

  • 像您使用 Marshal class 上的方法一样手动整理内容.
  • 使用unsafe直接访问指针(并更改您的类型以使用指针)。这需要 /unsafe compiler option这可能是也可能不是您的选择。
  • 使用C++/CLI在 C++ 中创建一个托管包装器,它将导出 .NET 类型,但在 C++ 中处理编码(marshal)处理(这可能更容易,具体取决于您的舒适程度和您尝试访问的 API 的复杂性)。

请注意,在上述所有情况下,您仍然需要知道返回数组的长度(它可能与指针和类型一起在结构中)。

关于c# - 如何编码包含指向未知类型的 C 样式数组的第一个元素的指针的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9878641/

相关文章:

c# - 对列表进行分组,并且仅当输入是列表时才获取不同的值

c# - p 调用非托管 DLL 时获取标准输出?

c# - 如何从 C# 调用 C++ DLL 导出函数

c# - 通过 IsVisibility 控制 Telerki GridViewDataColumn 的可见性

c# - 使用相同的证书进行 SSL 通信以及对 EXE 和 DLL 进行签名

c# - 是否可以保持统一激活脚本?

c# - 使用可选参数和命名参数解决歧义

c# - WPF 中类似 Google map 的滚动面板

.net - Microsoft安全通报(2269637)对.NET编码的影响

c# - 以 WPF 形式显示 EmguCV 图像