绑定故障排除

有关在 Xamarin.Mac 中对 macOS(以前称为 OS X)API 的绑定进行故障排除的一些提示。

缺少绑定

虽然 Xamarin.Mac 涵盖了大部分 Apple API,但有时可能需要调用尚没有绑定的 Apple API。 在其他情况下,需要调用第三方 C/Objective-C ,使其超出 Xamarin.Mac 绑定的范围。

如果你正在处理 Apple API,第一步是让 Xamarin 知道你正在点击我们尚未覆盖的 API 的一部分。 提交一个 bug ,指出缺少的 API。 我们使用来自客户的报表来确定下一步工作的 API 的优先级。 此外,如果你有企业版或企业版许可证,并且缺少绑定会阻止你的进度,请遵循支持的说明提交票证。 我们无法承诺绑定,但在某些情况下,我们可以让你解决此问题。

通知 Xamarin(如果适用)缺少的绑定后,下一步是考虑自行绑定它。 此处提供了完整的指南和此处的一些非官方文档,用于手动包装Objective-C绑定。 如果要调用 C API,则可以使用 C# 的 P/Invoke 机制,此处提供了文档。

如果决定自行处理绑定,请注意绑定中的错误可能会导致本机运行时发生各种有趣的崩溃。 具体而言,请非常小心,C# 中的签名与本机签名匹配的参数数和每个参数的大小。 无法执行此操作可能会损坏内存和/或堆栈,并且将来可能会立即或在某些任意点崩溃或损坏数据。

将 null 传递给绑定时的参数异常

虽然 Xamarin 致力于为 Apple API 提供高质量且经过良好测试的绑定,但有时出错和 bug 会下滑。 到目前为止,最常见的问题是在基础 API 接受nil时传入 null 时引发ArgumentNullException的 API。 定义 API 的本机头文件通常不提供足够的信息,说明哪些 API 接受 nil,如果传入,则会崩溃。

如果遇到传入 null 引发 ArgumentNullException 但认为它应该正常工作的情况,请执行以下步骤:

  1. 检查 Apple 文档和/或示例,查看是否可以找到它接受 nil的证据。 如果熟悉 Objective-C,可以编写一个小型测试程序来验证它。
  2. 提交 bug
  3. 你能解决 bug 吗? 如果可以避免使用 null 调用 API,则围绕调用的简单 null 检查可能是一种简单的解决方法。
  4. 但是,某些 API 需要传入 null 才能关闭或禁用某些功能。 在这些情况下,可以通过打开程序集浏览器(请参阅查找给定选择器的 C# 成员)、复制绑定以及删除 null 检查来解决此问题。 如果执行此操作,请确保提交 bug(步骤 2),因为复制的绑定不会收到我们在 Xamarin.Mac 中所做的更新和修复,这应该被视为短期解决方法。

报告 bug

反馈对我们非常重要。 如果发现 Xamarin.Mac 存在任何问题:

GitHub 的问题是完全公开的。 不能隐藏注释或附件。

请尽可能多地包含以下内容:

  • 一个重现此问题的简单示例。 在可能的情况下,这非常有用
  • 故障的完整堆栈跟踪。
  • 故障周围的 C# 代码。