Устранение неполадок при привязке

Некоторые советы по устранению неполадок с привязками к API macOS (прежнее название — OS X) в Xamarin.Mac.

Отсутствующие привязки

Хотя Xamarin.Mac охватывает большую часть API Apple, иногда может потребоваться вызвать некоторые API Apple, которые еще не имеют привязки. В других случаях необходимо вызвать стороннее приложение C/Objective-C, которое оно выходит за пределы область привязок Xamarin.Mac.

Если вы работаете с API Apple, первым шагом является предоставление Xamarin знать, что вы попадаете в раздел API, который у нас еще нет. Отправьте ошибку, отметив отсутствующий API. Мы используем отчеты от клиентов, чтобы определить приоритеты api, над которыми мы работаем дальше. Кроме того, если у вас есть лицензия Business или Enterprise, и это отсутствие привязки блокирует ход выполнения, также следуйте инструкциям в разделе "Поддержка " для отправки билета. Мы не можем обещать привязку, но в некоторых случаях мы можем получить вам работу вокруг.

Когда вы уведомите Xamarin (если применимо) о недостающей привязке, следующий шаг — рассмотреть возможность привязки к ней самостоятельно. У нас есть полное руководство здесь и некоторая неофициальная документация здесь для упаковки Objective-C привязок вручную. Если вы вызываете API C, можно использовать механизм P/Invoke C#, документация приведена здесь.

Если вы решите самостоятельно работать над привязкой, помните, что ошибки в привязке могут создавать все виды интересных сбоев в собственной среде выполнения. В частности, убедитесь, что ваша подпись в C# соответствует собственной сигнатуре в количестве аргументов и размеру каждого аргумента. Сбой этого может привести к повреждению памяти и (или) стека, и вы можете немедленно завершить работу или в какой-либо произвольной точке в будущем или поврежденных данных.

Исключения аргументов при передаче null в привязку

Хотя Xamarin работает для обеспечения высокого качества и хорошо проверенных привязок для API Apple, иногда ошибки и ошибки скольжения. По крайней мере наиболее распространенной проблемой, с которыми может столкнуться API ArgumentNullException , вызывается при передаче значения NULL, когда базовый API принимает nil. Собственные файлы заголовков, определяющие API, часто не предоставляют достаточно сведений о том, какие API принимают nil, и что приведет к сбою при передаче.

Если вы работаете в null случае, когда передача вызывает исключение ArgumentNullException , но вы думаете, что это должно работать, выполните следующие действия:

  1. Проверьте документацию Apple и (или) примеры, чтобы узнать, можно ли найти подтверждение того, что оно принимает nil. Если вы комфортно Objective-Cс, можете написать небольшую тестовую программу, чтобы проверить ее.
  2. Файл ошибки.
  3. Можете ли вы обойти ошибку? Если вы можете избежать вызова API с nullпомощью простого null проверка вокруг вызовов может быть легкой работой.
  4. Однако для некоторых API требуется передать значение NULL, чтобы отключить или отключить некоторые функции. В этих случаях можно обойти проблему, создав браузер сборок (см. статью "Поиск члена C# для заданного селектора"), копирование привязки и удаление null проверка. Если это сделать, убедитесь, что при выполнении этой ошибки не будут получаться обновления и исправления, которые мы делаем в Xamarin.Mac, и это должно рассматриваться как кратковременная работа.

Информирование об ошибках

Ваши отзывы очень важны для нас. Если у вас возникли проблемы с Xamarin.Mac:

Все проблемы GitHub находятся в открытом доступе. Здесь нет возможности скрыть комментарии или вложения.

Предоставьте следующие сведения с максимально возможными подробностями.

  • Простой пример, воспроизводящий проблему, если это возможно. Такая помощь будет бесценной.
  • Полная трассировка стека после сбоя.
  • Код C#, относящийся к проявлению сбоя.