Solución de problemas de enlace

Algunas sugerencias para solucionar problemas de enlaces a las API de macOS (anteriormente conocidas como OS X) en Xamarin.Mac.

Faltan enlaces

Aunque Xamarin.Mac cubre gran parte de las API de Apple, a veces es posible que tenga que llamar a alguna API de Apple que aún no tenga un enlace. En otros casos, debe llamar a C/Objective-C de terceros que esté fuera del ámbito de los enlaces de Xamarin.Mac.

Si trabaja con una API de Apple, el primer paso es informar a Xamarin de que está alcanzando una sección de la API que aún no tenemos cobertura. Archivo un error que indica que falta la API. Usamos informes de clientes para priorizar qué API trabajamos a continuación. Además, si tiene una licencia empresarial o empresarial y esta falta de enlace está bloqueando el progreso, siga también las instrucciones de Soporte técnico para presentar una incidencia. No podemos prometer un enlace, pero en algunos casos podemos ayudarle a solucionarlo.

Una vez que notifique a Xamarin (si procede) del enlace que falta, el siguiente paso es considerar la posibilidad de enlazarlo usted mismo. Aquí tenemos una guía completa y documentación no oficial aquí para encapsular Objective-C enlaces a mano. Si llama a una API de C, puede usar el mecanismo P/Invoke de C#, la documentación está aquí.

Si decide trabajar en el enlace usted mismo, tenga en cuenta que los errores en el enlace pueden producir todo tipo de bloqueos interesantes en el tiempo de ejecución nativo. En concreto, tenga mucho cuidado de que la firma de C# coincida con la firma nativa en número de argumentos y el tamaño de cada argumento. Si no lo hace, puede dañar la memoria o la pila, y podría bloquearse inmediatamente o en algún punto arbitrario en el futuro o dañar los datos.

Excepciones de argumento al pasar null a un enlace

Mientras que Xamarin trabaja para proporcionar enlaces de alta calidad y bien probados para las API de Apple, a veces errores y errores se deslizan. Con seguridad, el problema más común en el que podría encontrarse es una API que se produce ArgumentNullException al pasar null cuando la API subyacente acepta nil. Los archivos de encabezado nativos que definen la API a menudo no proporcionan suficiente información sobre qué API aceptan nil y qué bloqueo se bloqueará si se pasa.

Si se encuentra en un caso en null el que pasar produce un ArgumentNullException pero cree que debería funcionar, siga estos pasos:

  1. Compruebe la documentación de Apple o los ejemplos para ver si puede encontrar una prueba de que acepta nil. Si está familiarizado con Objective-C, puede escribir un pequeño programa de prueba para comprobarlo.
  2. Archivo de un error.
  3. ¿Puede solucionar el error? Si puede evitar llamar a la API con null, una comprobación simple de null alrededor de las llamadas puede ser una solución fácil.
  4. Sin embargo, algunas API requieren pasar null para desactivar o deshabilitar algunas características. En estos casos, puede solucionar el problema al abrir el explorador de ensamblados (vea Buscar el miembro de C# para un selector determinado), copiar el enlace y quitar la comprobación null. Asegúrese de archivar un error (paso 2) si lo hace, ya que el enlace copiado no recibirá actualizaciones y correcciones que realizamos en Xamarin.Mac y esto debe considerarse una solución a corto plazo.

Notificación de errores

Sus comentarios son importantes. Si encuentra algún problema con Xamarin.Mac:

Los problemas de GitHub son públicos. No es posible ocultar comentarios ni datos adjuntos.

De la siguiente información, incluya toda la que pueda:

  • Un ejemplo sencillo que reproduzca el problema. Siempre que sea posible, esta información es muy útil.
  • El seguimiento de la pila completo del bloqueo.
  • El código de C# del bloqueo.