【问题标题】:Trouble binding Objective-C library to C# with Objective Sharpie使用 Objective Sharpie 将 Objective-C 库绑定到 C# 时遇到问题
【发布时间】:2017-10-19 01:19:37
【问题描述】:

我正在尝试浏览本指南:

https://developer.xamarin.com/guides/ios/advanced_topics/binding_objective-c/walkthrough/

正在尝试为此 github 项目创建绑定:

https://github.com/lminhtm/LMGaugeView

使用 Sharpie 3.4。

我遇到了以下问题:

  1. 我无法使用架构 i386 armv7 x86_64 arm64 生成 Fat 二进制文件,因为我正在针对 iOS11 构建。我只能生成架构为x86_64arm64 的Fat 二进制文件,尝试使用其他架构时会出现错误消息invalid iOS deployment version, iOS 10 is the max deployment target for 32-bit targets。这是预期的吗?

  2. 然后,当我使用 Sharpie 时,我能够生成 API 和 Struct 文件,但是,这些文件中的每一个都很大,Struct 以 24K+ 行结束,而 API 54K+ 行。我也关注了一个 youtube 教程,他得到的输出大约是 200 行左右,所以我的如此庞大的事实让我觉得有些事情正在发生。他的教程不是针对我的同一个 Objective-C 项目,但我什至尝试了与他相同的教程,并得到了相同的结果。

  3. 结构文件最终有超过 7K 的错误,我看到无数行看起来像这样:

    // extern long double tanhl (long double) __attribute__((const)) __attribute__((nothrow));
    [DllImport ("__Internal")]
    [Verify (PlatformInvoke)]
    static extern [unsupported Builtin: long double] tanhl ([unsupported Builtin: long double]);
    

它缺少标识符名称并且有这个 [unsupported Builtin: 我不明白的部分。

还有无数对其他 iOS 版本、watchOS 和 TV 的引用,所以它似乎正在尝试为每个操作系统和版本创建 API 和 Structs,这就是为什么文件会这么大的原因。这是 Struct 文件中的一个小 sn-p:

    // extern CGPathRef _Nullable CGPathCreateCopyByTransformingPath (CGPathRef _Nullable path, const CGAffineTransform * _Nullable transform) __attribute__((availability(ios, introduced=5.0))) __attribute__((cf_audited_transfer));
    [iOS (5,0)]
    [DllImport ("__Internal")]
    [Verify (PlatformInvoke)]
    [return: NullAllowed]
    static extern unsafe CGPathRef* CGPathCreateCopyByTransformingPath ([NullAllowed] CGPathRef* path, [NullAllowed] CGAffineTransform* transform);

    // extern CGMutablePathRef _Nullable CGPathCreateMutableCopy (CGPathRef _Nullable path) __attribute__((availability(ios, introduced=2.0))) __attribute__((cf_audited_transfer));
    [iOS (2,0)]
    [DllImport ("__Internal")]
    [Verify (PlatformInvoke)]
    [return: NullAllowed]
    static extern unsafe CGMutablePathRef* CGPathCreateMutableCopy ([NullAllowed] CGPathRef* path);

    // extern CGMutablePathRef _Nullable CGPathCreateMutableCopyByTransformingPath (CGPathRef _Nullable path, const CGAffineTransform * _Nullable transform) __attribute__((availability(ios, introduced=5.0))) __attribute__((cf_audited_transfer));
    [iOS (5,0)]
    [DllImport ("__Internal")]
    [Verify (PlatformInvoke)]
    [return: NullAllowed]
    static extern unsafe CGMutablePathRef* CGPathCreateMutableCopyByTransformingPath ([NullAllowed] CGPathRef* path, [NullAllowed] CGAffineTransform* transform);

我知道这些文件应该更小,尤其是因为 Objective-C 代码是一个单独的头文件。我在这里做错了什么?

如果需要,我可以提供更多详细信息!

【问题讨论】:

  • 您是否安装了最新版本的 XCode (9) 和 Sharpie?我想帮忙,对 iOS 绑定有一些经验
  • 我快速检查了您提到的吊舱。事实证明,你必须拥有最新的 XCode 和 Sharpie(3.4 是当前版本)。您可以通过运行sharpie update 来更新 Sharpie。然后你可以生成一个绑定。我试过了,它似乎工作得很好,看看你自己:youtube.com/watch?v=g7qQJnMxubU&feature=youtu.be 我在视频中使用的工具是我用于 Xamarin.iOS 绑定的 Sharpie 的包装器
  • @AlexSorokoletov 我什至无法对你回答我表示感谢。我正在使用你的工具,它工作得非常完美,让我热泪盈眶,哈哈!如果有什么地方我可以捐赠给您,请告诉我,如果您将此添加为答案,我一定会接受。一百万次,谢谢!!
  • 让我看看,这可能是过时的 cocoapods repo 或其他我在自动中没有考虑的东西。谢谢你温暖的话语,让我开心:)
  • CocoaPods 团队说这是他们的 api 的问题 - 因为这个 WMGaugeView pod podspec url 已损坏。修复后我会在这里 ping 你,你可以生成绑定。

标签: xamarin xamarin.ios objective-sharpie


【解决方案1】:

我快速检查了您提到的 LMGaugeView 吊舱。

事实证明,你必须拥有最新的 XCode 和 Sharpie(3.4 是当前版本)。

您可以通过运行sharpie update 来更新 Sharpie。然后你可以生成一个绑定。

我已经尝试过了,它似乎工作得很好,看看你自己:youtube.com/watch?v=g7qQJnMxubU&feature=youtu.be

无耻插件 - 我在视频中使用的工具是我用于 Xamarin.iOS 绑定的 Sharpie 的包装器 - objc-automatic

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-08
    • 1970-01-01
    • 2012-09-09
    • 2023-03-12
    相关资源
    最近更新 更多