バインディングのトラブルシューティング
Xamarin.Mac の macOS (旧称 OS X) API へのバインドのトラブルシューティングに関するいくつかのヒント。
バインディングが見つからない
Xamarin.Mac には Apple API の多くが含まれていますが、バインディングがまだない Apple API を呼び出す必要がある場合があります。 それ以外の場合は、Xamarin.Mac バインドの範囲外でサード パーティの C/Objective-C を呼び出す必要があります。
Apple API を扱う場合、最初の手順は、まだ対象としていない API のセクションにアクセスしていることを Xamarin に通知することです。 不足している API を示すバグ を報告します。 お客様からのレポートを使用して、次に取り組む API に優先順位を付けます。 さらに、Business または Enterprise ライセンスを所有していて、バインドが不足しているために進行状況が妨げになっている場合は、サポートの指示に従ってチケットを提出することもできます。 バインディングを約束することはできませんが、場合によっては問題を回避できます。
不足しているバインディングについて Xamarin に通知したら (該当する場合)、次の手順では自分でバインドすることを検討します。 ここでは完全なガイドと、バインドを手動でラップObjective-Cするための非公式のドキュメントをここに用意しています。 C API を呼び出す場合は、C# の P/Invoke メカニズムを使用できます。ドキュメントはこちら です。
バインドを自分で操作する場合は、バインディングの誤りによって、ネイティブ ランタイムであらゆる種類の興味深いクラッシュが発生する可能性があることに注意してください。 特に、C# のシグネチャが、引数の数と各引数のサイズのネイティブシグネチャと一致することを非常に注意してください。 これを行わないと、メモリやスタックが破損する可能性があり、すぐに、または将来の任意の時点でクラッシュしたり、データが破損したりする可能性があります。
バインドに null を渡すときの引数の例外
Xamarin は Apple API の高品質でテスト済みのバインディングを提供するために機能しますが、間違いやバグが発生することがあります。 これまでに発生する可能性がある最も一般的な問題は、基になる API が受け入れるときに null を渡すときにスロー ArgumentNullException
する nil
API です。 API を定義するネイティブ ヘッダー ファイルでは、多くの場合、どの API が nil を受け入れ、渡すとクラッシュするかに関する十分な情報が提供されません。
渡すと null
スロー ArgumentNullException
されるが、動作すると思われる場合は、次の手順に従います。
- Apple のドキュメントや例を確認して、それが受け入れる証拠が見つかるかどうかを確認してください
nil
。 慣 Objective-Cれている場合は、小さなテスト プログラムを作成して検証できます。 - バグを報告します。
- バグを回避できますか? API
null
の呼び出しを回避できる場合は、呼び出しに関する単純な null チェックを簡単に回避できます。 - ただし、一部の API では、一部の機能をオフまたは無効にするために null を渡す必要があります。 このような場合は、アセンブリ ブラウザーを起動し (特定のセレクターの C# メンバーの検索を参照)、バインドをコピーし、null チェックを削除することで、この問題を回避できます。 これを行う場合は、必ずバグを報告してください (手順 2)。コピーしたバインディングは Xamarin.Mac で行った更新プログラムと修正プログラムを受け取らないので、これは短期的な回避策と見なす必要があります。
バグの報告
お客様のフィードバックは Microsoft にとって重要です。 Xamarin.Mac で問題が見つかる場合:
- Xamarin.Mac フォーラムを確認する
- 問題リポジトリを検索する
- 一致する問題が見つからない場合は、GitHub の問題リポジトリに新しい問題を提出してください。
GitHub の問題はすべて公開されています。 コメントまたは添付ファイルを非表示にすることはできません。
次の情報について、できるだけ多くを含めてください。
- 問題を再現する簡単な例。 これは重要です (可能な場合)。
- クラッシュの完全なスタック トレース。
- クラッシュの周囲の C# コード。