【问题标题】:Xamarin Unified API: Native library binding: NSUInteger vs. enumXamarin 统一 API:本机库绑定:NSUInteger 与枚举
【发布时间】:2015-07-12 06:28:38
【问题描述】:

借助 Xamarin 中的绑定项目,我正在绑定到原生 Objective-C 库。

一切正常。现在我将我的解决方案迁移到 Xamarin Unified API 和 32 位和 64 位,经过大量工作后,它又可以正常工作了。

虽然一切正常,但我想知道enums 如何在 32/64 环境下工作。

在 Objective-C 中我有:

typedef NS_OPTIONS(NSUInteger, ...在32位环境下备份32位,在64位环境下备份64位。

StructsAndEnums.cs 中,对于上述NS_OPTIONS-NSUInteger,我只有一个普通的enum。但是枚举(没有进一步说明)在 C# 中始终是 32 位的。该绑定如何在 64 位环境下工作?

是否有任何智能机制(在编译或运行时)可以识别本机库中的方法何时需要 64 位参数(并且可以将 32 位枚举“转换”为 64 位)?

【问题讨论】:

    标签: ios binding enums xamarin native


    【解决方案1】:

    是的,有。

    对枚举使用 64 位类型(long 或 ulong),并用 [Native] 属性装饰它:

    [Native]
    public enum MyEnum : long
    {
        // ...
    }
    

    然后你可以在你的 ApiDefinition.cs 中使用枚举,绑定代码会自动生成正确的东西。

    请注意,您不能在 P/Invokes 中使用这些枚举,因为它们不是特殊情况(在这些情况下可以使用本机类型 nint/nunit 代替)。

    【讨论】:

    • 感谢您的回答!我的问题是“是否已经有任何智能机制”?因为,它使用普通枚举(没有 [Native] 和 long)。我的问题是:为什么它会起作用?
    • [Native] 属性(并且具有 64 位支持类型)是它正常工作所必需的。如果没有它似乎也能正常工作,那你就走运了。
    • 嗯,我明白了。所以我将添加 [Native] 属性并将枚举类型设置为 ulong。这是否记录在某处?
    猜你喜欢
    • 2013-06-09
    • 1970-01-01
    • 2016-05-23
    • 1970-01-01
    • 2018-02-21
    • 2016-03-26
    • 1970-01-01
    • 2018-08-02
    • 1970-01-01
    相关资源
    最近更新 更多