我正在尝试从 C++ 编码到 C# 一个看起来像这样的结构:
typedef struct FooStruct {
Uint8 bytesPerThingie;
void *arrayOfThingies;
// other members ...
}
因此,在这种情况下有两个未知数:
- 数组中元素的数量。
- 每个元素的大小(以字节为单位)。
我之前已经成功编码了结构本身,定义如下:
[StructLayout(LayoutKind.Sequential)]
public struct FooStruct {
public byte bytesPerThingie;
public IntPtr arrayOfThingies;
// other members...
}
但现在我需要检查和修改嵌入式数组。
我明白了
- 就其本身而言,一个可blittable类型的可blittable元素数组是 本身可 blittable,但当它用作 结构。
- 从非托管代码编码(marshal)至 .NET Framework 时,数组长度为 根据 SizeConst 参数确定,可选地后跟非托管类型 数组元素的一部分,如果它们不可 blittable。
即使假设在这种情况下数组中的元素是 blittable 类型,如果我直到运行时才知道数组的大小,我如何设置编译时参数 SizeConst?
最佳答案
长话短说,你不能。 SizeConst
field在 MarshalAsAttribute
class 上被编译到现场的元数据中,并且不能在运行时更改(至少,不会以对您有利的方式)。
也就是说,您有以下选择:
- 像您使用
Marshal
class 上的方法一样手动整理内容. - 使用
unsafe
直接访问指针(并更改您的类型以使用指针)。这需要/unsafe
compiler option这可能是也可能不是您的选择。 - 使用C++/CLI在 C++ 中创建一个托管包装器,它将导出 .NET 类型,但在 C++ 中处理编码(marshal)处理(这可能更容易,具体取决于您的舒适程度和您尝试访问的 API 的复杂性)。
请注意,在上述所有情况下,您仍然需要知道返回数组的长度(它可能与指针和类型一起在结构中)。
关于c# - 如何编码包含指向未知类型的 C 样式数组的第一个元素的指针的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9878641/