Problembehandlung bei Bindungen

Einige Tipps zur Problembehandlung bei Bindungen an macOS-APIs (ehemals OS X) in Xamarin.Mac.

Fehlende Bindungen

Obwohl Xamarin.Mac einen Großen Teil der Apple-APIs abdeckt, müssen Sie manchmal eine Apple-API aufrufen, die noch keine Bindung hat. In anderen Fällen müssen Sie den Drittanbieter C/ aufrufen, der außerhalb des Bereichs der Objective-C Xamarin.Mac-Bindungen liegt.

Wenn Sie eine Apple-API verwenden, besteht der erste Schritt im Informieren von Xamarin darüber, dass Sie einen Abschnitt der API erreichen, für den wir noch keine Abdeckung haben. Fehler melden auf die fehlende API. Wir verwenden Berichte von Kunden, um zu priorisieren, an welchen APIs wir als Nächstes arbeiten. Wenn Sie über eine Business- oder Enterprise-Lizenz verfügen und diese fehlende Bindung Ihren Fortschritt blockiert, befolgen Sie auch die Anweisungen unter Support, um ein Ticket zu erstellen. Wir können keine Bindung zusagen, aber in einigen Fällen können wir Ihnen eine Arbeit verschaffen.

Nachdem Sie Xamarin (falls zutreffend) über Ihre fehlende Bindung benachrichtigt haben, besteht der nächste Schritt in der Selbstbindung. Hier finden Sie eine vollständige Anleitung und eine inoffizielle Dokumentation zum umschließenden Bindungen. Wenn Sie eine C-API aufrufen, können Sie den P/Invoke-Mechanismus von C# verwenden. Die Dokumentation finden Sie hier.

Wenn Sie selbst an der Bindung arbeiten möchten, beachten Sie, dass Fehler in der Bindung in der nativen Laufzeit zu allen möglichen interessanten Abstürzen werden können. Achten Sie insbesondere darauf, dass Ihre Signatur in C# der nativen Signatur in Der Anzahl von Argumenten und der Größe der einzelnen Argumente entspricht. Wenn Sie dies nicht tun, kann der Arbeitsspeicher und/oder der Stapel beschädigt werden, und Sie können sofort oder zu einem beliebigen Zeitpunkt in der Zukunft oder zu beschädigten Daten abstürzen.

Argumentausnahmen beim Übergeben von NULL an eine Bindung

Xamarin bietet zwar qualitativ hochwertige und gut getestete Bindungen für die Apple-APIs, aber manchmal werden Fehler und Fehler nicht mehr unterstützt. Das bei weitem häufigste Problem, auf das Sie möglicherweise laufen, ist eine API, die beim Übergeben von NULL löst, wenn die zugrunde liegende ArgumentNullException API nil akzeptiert. Die nativen Headerdateien, die die API definieren, enthalten häufig nicht genügend Informationen darüber, welche APIs NULL akzeptieren und welche abstürzen, wenn Sie sie übergeben.

Führen Sie die folgenden Schritte aus, wenn die Übergabe von eine ausspricht, aber Sie der Meinung sind, dass sie nullArgumentNullException funktionieren sollte:

  1. Überprüfen Sie die Apple-Dokumentation und/oder -Beispiele, um zu überprüfen, ob Sie einen Nachweis dafür finden können, dass akzeptiert nil wird. Wenn Sie mit arbeiten, Objective-C können Sie ein kleines Testprogramm schreiben, um es zu überprüfen.
  2. Fehler melden.
  3. Können Sie den Fehler beheben? Wenn Sie das Aufrufen der API mit vermeiden können, kann eine einfache NULL-Überprüfung der Aufrufe eine null einfache Problemumkung sein.
  4. Einige APIs erfordern jedoch die Übergabe von NULL, um einige Features zu deaktivieren oder zu deaktivieren. In diesen Fällen können Sie das Problem beheben, indem Sie den Assemblybrowser öffnen (siehe Suchen des C#-Membersfür einen bestimmten Selektor), die Bindung kopieren und die NULL-Überprüfung entfernen. Stellen Sie sicher, dass Sie in diesem Fall einen Fehler (Schritt 2) melden, da Ihre kopierte Bindung keine Updates und Fehlerbehebungen erhält, die wir in Xamarin.Mac machen. Dies sollte als kurzfristige Problemumkärfung betrachtet werden.

Melden von Fehlern

Ihr Feedback ist uns sehr wichtig. Bei Problemen mit Xamarin.Mac:

GitHub-Issues sind allesamt öffentlich. Es ist nicht möglich, Kommentare oder Anlagen auszublenden.

Fügen Sie möglichst viele der folgenden Informationen hinzu:

  • Ein einfaches Beispiel, um das Problem zu reproduzieren. Dies ist von sehr großem Nutzen, sofern möglich.
  • Die vollständige Stapelüberwachung des Absturzes.
  • Den C#-Code, der den Absturz umgibt.