Partager via


Résolution des problèmes de liaison

Quelques conseils pour résoudre les problèmes liés aux liaisons avec les API macOS (anciennement OS X) dans Xamarin.Mac.

Liaisons manquantes

Bien que Xamarin.Mac couvre une grande partie des API Apple, vous devrez parfois appeler une API Apple qui n’a pas encore de liaison. Dans d’autres cas, vous devez appeler un tiers C/Objective-C qu’il en dehors de l’étendue des liaisons Xamarin.Mac.

Si vous utilisez une API Apple, la première étape consiste à informer Xamarin que vous atteignez une section de l’API que nous n’avons pas encore de couverture. Déposez un bogue en notant l’API manquante. Nous utilisons des rapports de clients pour hiérarchiser les API sur lesquelles nous travaillons ensuite. En outre, si vous disposez d’une licence Entreprise ou Entreprise et que ce manque de liaison bloque votre progression, suivez également les instructions du Support pour déposer un ticket. Nous ne pouvons pas promettre une liaison, mais dans certains cas, nous pouvons vous faire travailler.

Une fois que vous informez Xamarin (le cas échéant) de votre liaison manquante, l’étape suivante consiste à envisager de le lier vous-même. Nous avons ici un guide complet et une documentation non officielle ici pour encapsuler Objective-C les liaisons manuellement. Si vous appelez une API C, vous pouvez utiliser le mécanisme P/Invoke de C#, la documentation est ici.

Si vous décidez de travailler sur la liaison vous-même, sachez que les erreurs dans la liaison peuvent produire toutes sortes d’incidents intéressants dans le runtime natif. En particulier, veillez à ce que votre signature en C# corresponde à la signature native en nombre d’arguments et à la taille de chaque argument. L’échec de cette opération peut endommager la mémoire et/ou la pile, et vous pouvez se bloquer immédiatement ou à un point arbitraire dans le futur ou les données endommagées.

Exceptions d’argument lors de la transmission de la valeur Null à une liaison

Bien que Xamarin fonctionne pour fournir des liaisons de haute qualité et bien testées pour les API Apple, parfois des erreurs et des bogues se glissent. De loin, le problème le plus courant auquel vous risquez d’être exécuté est une levée d’API ArgumentNullException lorsque vous transmettez null lorsque l’API sous-jacente accepte nil. Les fichiers d’en-tête natifs définissant l’API ne fournissent souvent pas suffisamment d’informations sur les API qui acceptent nil et qui se bloquent si vous le transmettez.

Si vous rencontrez un cas où la transmission null lève un ArgumentNullException élément, mais que vous pensez qu’elle doit fonctionner, procédez comme suit :

  1. Consultez la documentation Apple et/ou des exemples pour voir si vous pouvez trouver la preuve qu’elle accepte nil. Si vous êtes à l’aise avec Objective-C, vous pouvez écrire un petit programme de test pour le vérifier.
  2. Fichier d’un bogue.
  3. Pouvez-vous contourner le bogue ? Si vous pouvez éviter d’appeler l’API avec null, une simple case activée null autour des appels peut être un travail facile.
  4. Toutefois, certaines API nécessitent la transmission de null pour désactiver ou désactiver certaines fonctionnalités. Dans ces cas, vous pouvez contourner le problème en affichant le navigateur d’assembly (voir Recherche du membre C# pour un sélecteur donné), en copiant la liaison et en supprimant la case activée Null. Veillez à enregistrer un bogue (étape 2) si vous effectuez cette opération, car votre liaison copiée ne recevra pas de mises à jour et de correctifs que nous faisons dans Xamarin.Mac, et cela doit être considéré comme un travail à court terme.

Signalement des bogues

Vos commentaires sont très importants pour nous. Si vous rencontrez des problèmes avec Xamarin.Mac :

Les problèmes GitHub sont tous publics. Il n’est pas possible de masquer des commentaires ou des pièces jointes.

Dans la mesure du possible, essayez d’inclure :

  • Un exemple simple reproduisant le problème. Si vous pouvez en fournir un, c’est inestimable.
  • La trace de pile complète du plantage.
  • Le code C# se rapportant au plantage.