c# - 在 C# 中包装包含固定大小 C 数组的结构

标签 c# arrays swig

我目前正在包装一个库,由于包含固定大小的无符号短数组的结构,我无法更改该库,我似乎无法使用包装器生成器 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];
}

这定义了嵌入在结构中的数组,而不是引用的数组变量。 当然,这必须是固定大小的,以便在编译时定义结构的大小。

此示例取自此处。 https://learn.microsoft.com/de-de/dotnet/csharp/programming-guide/unsafe-code-pointers/fixed-size-buffers

使用 StructLayout 属性,您可以控制结构的某个成员必须从哪个字节开始,它们甚至可以重叠。因此,您可以生成任何您喜欢的内容,将任何按字节定义的记录映射到 C# 结构。

我不知道你的 swig 工具。

此解决方案需要不安全的代码。 (这只是一个关键字,不用担心)

旧的字符方法如下所示:

struct Foo
{
    [MarshalAs(UnmanagedType.ByValArray, SizeConst=123)]
     public char[] chars;
}

关于c# - 在 C# 中包装包含固定大小 C 数组的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65234523/

相关文章:

C# 自定义 Linq 提供程序

javascript - 如何从 String.prototype.replace() 方法中的回调返回正确的值?

foreach 循环中的 php key() 奇怪行为或获取 foreach 循环中的下一个键

python - 将 C++ 字符串类转换为 Python 字符串

c++ - SWIG 和 C++ 构造函数

c# - 使用部分类进行验证?

c# - 将泛型传递给扩展方法

c# - C# 中的 Windows 时区下拉菜单

arrays - 动态维度/填充二维数组

c++ - SWIG 包装的 vector vector (C++ 到 python)——如何将内部 vector 识别为代理对象?