我目前正在包装一个库,由于包含固定大小的无符号短数组的结构,我无法更改该库,我似乎无法使用包装器生成器 SWIG 将其包装成 C# 中的类似内容。
我创建了一个简约的示例 swig 项目文件,其中包含重现我的问题所需的所有内容。
%module SwigExperimentWrapper
struct ImportantData
{
static const unsigned short arraySize = 33;
unsigned short someUShortArray[arraySize];
};
数组的结果类型不令人满意。我期待类似的东西
fixed ushort someUShortArray[arraySize];
在 C# 中,但我只得到 SWIGTYPE_p_unsigned_short 类型,这表明 SWIG 可能没有足够的信息来说明如何处理该数组。请注意,如果我只定义没有结构的数组,行为是相同的。
我怀疑我需要一些类型映射来解决该问题,但首先我需要理解,为什么它不会生成符合我期望的东西。我觉得,我错过了一些东西,但我以前在 SWIG 中遇到过这样的问题,而且这些问题似乎更相关。
我很感激任何类型的输入,因为我无法在各种搜索中找到任何内容。
最佳答案
这个意义上的固定关键字仅在组成结构时才有用
internal unsafe struct Buffer
{
public fixed char fixedBuffer[128];
}
这定义了嵌入在结构中的数组,而不是引用的数组变量。 当然,这必须是固定大小的,以便在编译时定义结构的大小。
使用 StructLayout 属性,您可以控制结构的某个成员必须从哪个字节开始,它们甚至可以重叠。因此,您可以生成任何您喜欢的内容,将任何按字节定义的记录映射到 C# 结构。
我不知道你的 swig 工具。
此解决方案需要不安全的代码。 (这只是一个关键字,不用担心)
旧的字符方法如下所示:
struct Foo
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst=123)]
public char[] chars;
}
关于c# - 在 C# 中包装包含固定大小 C 数组的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65234523/