Xamarin 统一 API:本机库绑定:NSUInteger 与枚举
Xamarin Unified API: Native library binding: NSUInteger vs. enum
我在 Xamarin 中的绑定项目的帮助下绑定到本机 Objective-C 库。
一切正常。现在我将我的解决方案迁移到 Xamarin Unified API 和 32 位和 64 位,经过大量工作后,它再次正常工作。
虽然一切正常,但我想知道 enum
s 如何在 32/64 环境下工作。
在Objective-C我有:
typedef NS_OPTIONS(NSUInteger, ...
在32位环境下备份32位,在64位环境下备份64位
在 StructsAndEnums.cs
中,我对上述 NS_OPTIONS-NSUInteger
只有一个正常的 enum
。但是枚举(没有进一步说明)在 C# 中始终是 32 位的。该绑定如何在 64 位环境下工作?
是否有任何智能机制(在编译或 运行 时)识别本机库中的方法何时需要 64 位参数(并且可以 "convert" 将 32 位枚举转换为 64少量)?
是的,有。
枚举使用 64 位类型(long 或 ulong),并使用 [Native] 属性对其进行修饰:
[Native]
public enum MyEnum : long
{
// ...
}
然后你可以在你的ApiDefinition.cs中使用枚举,绑定代码会自动生成正确的东西。
请注意,您不能在 P/Invokes 中使用这些枚举,因为它们不是特殊情况(在这些情况下可以使用本机类型 nint/nunit)。
我在 Xamarin 中的绑定项目的帮助下绑定到本机 Objective-C 库。
一切正常。现在我将我的解决方案迁移到 Xamarin Unified API 和 32 位和 64 位,经过大量工作后,它再次正常工作。
虽然一切正常,但我想知道 enum
s 如何在 32/64 环境下工作。
在Objective-C我有:
typedef NS_OPTIONS(NSUInteger, ...
在32位环境下备份32位,在64位环境下备份64位
在 StructsAndEnums.cs
中,我对上述 NS_OPTIONS-NSUInteger
只有一个正常的 enum
。但是枚举(没有进一步说明)在 C# 中始终是 32 位的。该绑定如何在 64 位环境下工作?
是否有任何智能机制(在编译或 运行 时)识别本机库中的方法何时需要 64 位参数(并且可以 "convert" 将 32 位枚举转换为 64少量)?
是的,有。
枚举使用 64 位类型(long 或 ulong),并使用 [Native] 属性对其进行修饰:
[Native]
public enum MyEnum : long
{
// ...
}
然后你可以在你的ApiDefinition.cs中使用枚举,绑定代码会自动生成正确的东西。
请注意,您不能在 P/Invokes 中使用这些枚举,因为它们不是特殊情况(在这些情况下可以使用本机类型 nint/nunit)。