问题描述
我正在使用unsafe
代码为C库编写C#绑定。我不知道如何表示在所有情况下都有效的size_t
:
-
System.[U]IntPtr
不能与fixed-sized buffer(我需要)一起使用,因为它们被列入白名单,仅适用于一些基本类型。 - 使用编译时指令与
using Usize = System.Uint32/64
来别名化类型是可行的,但是a)破坏了体系结构之间生成的二进制文件的可移植性,并且b)我必须在所有使用{{1 }}类型。
那么,使用Usize
编写C绑定的正确方法是什么?
解决方法
size_t因平台而异,没有C#等效项。 .Net指出
不幸的是,.NET中没有针对这些类型的预定义解决方案 2.0。因此,必须设计一个。最大的问题是您通常运行相同的.NET二进制文件或32位和64位。所以我们需要一个 类型,其大小是在运行时根据来自 平台。 .NET无法定义这样的类型。 最好的办法是定义一个固定大小的类型和一个自定义 决定运行时大小的封送处理程序。
因此,通过使用 Usize = System.Uint32 / 64
为类型加上别名,使用UIntPtr将是您唯一的选择。