系結疑難解答

針對 Xamarin.Mac 中的系結進行疑難解答的一些秘訣(先前稱為 OS X) API。

遺漏系結

雖然 Xamarin.Mac 涵蓋大部分的 Apple API,但有時候您可能需要呼叫一些尚未有系結的 Apple API。 在其他情況下,您必須呼叫第三方 C/Objective-C ,使其超出 Xamarin.Mac 系結的範圍。

如果您正在處理Apple API,第一個步驟是讓 Xamarin 知道您正在達到我們尚未涵蓋的 API 區段。 提出錯誤 ,指出遺漏的 API。 我們會使用來自客戶的報表來排定下一個工作 API 的優先順序。 此外,如果您有商務或企業版授權,且缺少系結會封鎖您的進度,也請依照支援中的指示提出票證。 我們無法承諾系結,但在某些情況下,我們可以讓您解決。

一旦您通知 Xamarin(如果適用的話)遺失的系結,下一個步驟就是考慮自行系結。 我們在這裡有完整的指南和一些非官方檔,可以手動包裝Objective-C系結。 如果您要呼叫 C API,您可以使用 C# 的 P/Invoke 機制,文件 位於這裡

如果您決定自行處理系結,請注意系結中的錯誤可以在原生運行時間產生各種有趣的當機。 特別請注意,C# 中的簽章符合自變數數目的原生簽章和每個自變數的大小。 若無法這麼做,可能會損毀記憶體和/或堆疊,而且您未來可能會立即或在某些任意時間點損毀或損毀數據。

將 Null 傳遞至系結時的自變數例外狀況

雖然 Xamarin 可針對 Apple API 提供高品質且經過良好測試的系結,但有時錯誤和錯誤會下滑。 到目前為止,最常見的問題是,當您在基礎 API 接受 nil時傳入 Null 時,會擲ArgumentNullException回 API。 定義 API 的原生頭檔通常不會提供足夠的資訊,說明哪些 API 接受 nil,而且當您傳入 API 時會當機。

如果您遇到傳入 nullArgumentNullException 回 但您認為應該運作的情況,請遵循下列步驟:

  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# 程式碼。