Problembehandlung beim Binden

Einige Tipps für die Problembehandlung bei Bindungen an macOS-APIs (früher als OS X bezeichnet) in Xamarin.Mac.

Fehlende Bindungen

Während Xamarin.Mac einen Großteil der Apple-APIs abdeckt, müssen Sie manchmal möglicherweise eine Apple-API aufrufen, die noch keine Bindung hat. In anderen Fällen müssen Sie C/Objective-C von Drittanbietern aufrufen, die außerhalb des Gültigkeitsbereichs der Xamarin.Mac-Bindungen enthalten sind.

Wenn Sie mit einer Apple-API umgehen, besteht der erste Schritt darin, Xamarin mitzuteilen, dass Sie einen Abschnitt der API treffen, für den wir noch keine Abdeckung haben. Fehler beim Notieren der fehlenden 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 dieser Mangel an Bindung ihren Fortschritt blockiert, folgen Sie außerdem den Anweisungen beim Support , um ein Ticket zu übermitteln. Wir können keine Bindung versprechen, aber in einigen Fällen können wir Ihnen eine Arbeit machen.

Sobald Sie Xamarin (falls zutreffend) über Ihre fehlende Bindung benachrichtigen, besteht der nächste Schritt darin, sie selbst zu binden. Wir haben hier einen vollständigen Leitfaden und einige inoffizielle Dokumentationen hier zum Umschließen Objective-C von Bindungen von Hand. Wenn Sie eine C-API aufrufen, können Sie den P/Invoke-Mechanismus von C# verwenden. Die Dokumentation ist hier.

Wenn Sie sich für die Bindung entscheiden, beachten Sie, dass Fehler in der Bindung alle Arten interessanter Abstürze in der nativen Laufzeit erzeugen können. Achten Sie insbesondere darauf, dass Ihre Signatur in C# mit der systemeigenen Signatur in der Anzahl der Argumente und der Größe jedes Arguments übereinstimmt. Andernfalls kann der Speicher und/oder der Stapel beschädigt werden, und Sie können sofort oder an einem beliebigen Punkt in der Zukunft oder beschädigte Daten abstürzen.

Argumentausnahmen beim Übergeben von NULL an eine Bindung

Während Xamarin arbeitet, um qualitativ hochwertige und gut getestete Bindungen für die Apple-APIs bereitzustellen, manchmal Fehler und Fehler rutschen ein. Das häufigste Problem, in dem Sie möglicherweise auftreten, ist eine API, die ausgelöst wird ArgumentNullException , wenn Sie null übergeben, wenn die zugrunde liegende API akzeptiert nilwird. Die systemeigenen Headerdateien, die die API definieren, liefern häufig nicht genügend Informationen darüber, welche APIs nil akzeptieren und was abstürzt, wenn Sie sie übergeben.

Wenn ein Fall auftritt, in dem das Übergeben null einen ArgumentNullException Fall auslöst, aber Sie der Meinung sind, dass dies funktioniert, führen Sie die folgenden Schritte aus:

  1. Überprüfen Sie die Apple-Dokumentation und/oder Beispiele, um festzustellen, ob Sie den Nachweis finden können, dass er akzeptiert nil. Wenn Sie mit dem Programm vertraut Objective-Csind, können Sie ein kleines Testprogramm schreiben, um es zu überprüfen.
  2. Datei eines Fehlers.
  3. Können Sie den Fehler umgehen? Wenn Sie das Aufrufen der API vermeiden nullkönnen, kann eine einfache NULL-Überprüfung der Aufrufe eine einfache Arbeit 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 umgehen, indem Sie den Assemblybrowser aufrufen (siehe Suchen des C#-Mitglieds für einen bestimmten Selektor), Kopieren der Bindung und Entfernen der NULL-Prüfung. Stellen Sie sicher, dass Sie einen Fehler (Schritt 2) ablegen, wenn Sie dies tun, da Ihre kopierte Bindung keine Updates und Korrekturen empfängt, die wir in Xamarin.Mac vornehmen, und dies sollte als kurze Arbeit angesehen werden.

Melden von Fehlern

Ihr Feedback ist uns sehr wichtig. Wenn Sie Probleme mit Xamarin.Mac finden:

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.