Risoluzione dei problemi relativi all'associazione

Alcuni suggerimenti per la risoluzione dei problemi relativi alle associazioni alle API macOS (in precedenza note come OS X) in Xamarin.Mac.

Associazioni mancanti

Anche se Xamarin.Mac copre gran parte delle API Apple, a volte potrebbe essere necessario chiamare alcune API Apple che non hanno ancora un'associazione. In altri casi, è necessario chiamare C/Objective-C di terze parti che non rientra nell'ambito dei binding Xamarin.Mac.

Se si usa un'API Apple, il primo passaggio consiste nel informare Xamarin che si sta raggiungendo una sezione dell'API per cui non è ancora disponibile copertura. Inviare un bug che nota l'API mancante. I report dei clienti vengono usati per classificare in ordine di priorità le API su cui si lavora successivamente. Inoltre, se si dispone di una licenza Business o Enterprise e questa mancanza di un binding blocca lo stato di avanzamento, seguire anche le istruzioni riportate in Supporto tecnico per inviare un ticket. Non possiamo promettere un binding, ma in alcuni casi possiamo farti un giro.

Dopo aver informato Xamarin (se applicabile) dell'associazione mancante, il passaggio successivo consiste nel prendere in considerazione l'associazione. Abbiamo una guida completa qui e una documentazione non ufficiale qui per il wrapping Objective-C manuale dei binding. Se si chiama un'API C, è possibile usare il meccanismo P/Invoke di C#, la documentazione è disponibile qui.

Se si decide di lavorare manualmente sull'associazione, tenere presente che gli errori nell'associazione possono produrre tutti i tipi di arresti anomali interessanti nel runtime nativo. In particolare, prestare molta attenzione al fatto che la firma in C# corrisponda alla firma nativa in numero di argomenti e alle dimensioni di ogni argomento. In caso contrario, potrebbe danneggiare la memoria e/o lo stack e potrebbe verificarsi un arresto anomalo immediato o in un punto arbitrario nei dati futuri o danneggiati.

Eccezioni di argomento quando si passa null a un'associazione

Mentre Xamarin lavora per fornire associazioni di alta qualità e ben testate per le API Apple, a volte errori e bug scivolano. Di gran lunga il problema più comune che si potrebbe riscontrare è un'API che ArgumentNullException genera quando si passa null quando l'API sottostante accetta nil. I file di intestazione nativi che definiscono l'API spesso non forniscono informazioni sufficienti su quali API accettano nil e che si arresterà in modo anomalo se lo si passa.

Se si verifica un caso in null cui il passaggio genera un'eccezione ArgumentNullException , ma si ritiene che funzioni, seguire questa procedura:

  1. Controllare la documentazione di Apple e/o gli esempi per verificare se è possibile trovare la prova che accetta nil. Se si ha familiarità con Objective-C, è possibile scrivere un piccolo programma di test per verificarlo.
  2. Archiviare un bug.
  3. È possibile risolvere il bug? Se è possibile evitare di chiamare l'API con null, un semplice controllo Null intorno alle chiamate può essere un semplice soluzione alternativa.
  4. Tuttavia, alcune API richiedono il passaggio di null per disattivare o disabilitare alcune funzionalità. In questi casi, è possibile risolvere il problema visualizzando il browser dell'assembly (vedere Ricerca del membro C# per un determinato selettore), copia dell'associazione e rimozione del controllo Null. Assicurarsi di segnalare un bug (passaggio 2) se si esegue questa operazione, perché l'associazione copiata non riceverà aggiornamenti e correzioni apportate in Xamarin.Mac e questo dovrebbe essere considerato un problema a breve termine.

Segnalazione di bug

I commenti degli utenti sono importanti. Se si verificano problemi con Xamarin.Mac:

I problemi di GitHub sono tutti pubblici. Non è possibile nascondere commenti o allegati.

Includere tutte le informazioni disponibili seguenti:

  • Un esempio semplice che riproduce il problema. Questo è molto importante, ove possibile.
  • L'analisi dello stack completa dell'arresto anomalo.
  • Il codice C# relativo all'arresto anomalo.