FFI的size_t兼容类型

问题描述

我正在使用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将是您唯一的选择。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...