¿Por qué agregar una referencia a System.Memory rompe mi proyecto de iOS?
Resumen
Tengo una solución con dos proyectos: un proyecto .NET Standard y un proyecto iOS que hace referencia al proyecto .NET Standard.
Si el proyecto .NET Standard no hace referencia al paquete nuget System.Memory (específicamente las versiones 4.5.3 o 4.5.4), todo funciona bien. Si agrego una referencia a System.Memory en el proyecto .NET Standard, entonces mi proyecto iOS se bloquea con una MissingMethodException.
Nota: Este problema solo ocurre en iOS, no se reproduce en Xamarin Android.
¿Cómo puedo resolver este problema?
Detalles
Mi proyecto está utilizando la biblioteca TopTen.RichTextKit (https://www.nuget.org/packages/Topten.RichTextKit/) para realizar la medición de bloques de texto. Cuando ejecuto mi código en iOS, obtengo el siguiente bloqueo al llamar al método TextBlock.MeasuredHeight:
System.InvalidOperationException: 'Excepción en BuildFontRuns() con longitud original de 11 ahora 11, recuento de ejecuciones de estilo 1, recuento de ejecuciones de fuente 0, anulaciones de dirección: Falso'
Esto tiene una excepción interna:
Method not found: void SkiaSharp.SKFont.GetGlyphs(System.ReadOnlySpan1<int>,System.Span
1<uint16>)
Al eliminar paquetes nuget uno por uno y usar un proyecto de prueba, descubrí que el error ocurre si hago referencia a System.Memory versión 4.5.4 en mi proyecto .NET Standard. Si elimino esta versión, el bloqueo desaparece.
Además, diferentes versiones de System.Memory dan lugar a diferentes comportamientos:
- 4.5.0 – funciona
- 4.5.1 – no se compila
- 4.5.2 – no se compila
- 4.5.3 – se bloquea
- 4.5.4 – se bloquea
Desafortunadamente, no puedo retroceder a System.Memory 4.5.0 porque otras bibliotecas requieren una versión >= 4.5.4.
No entiendo completamente las explicaciones, pero he encontrado algunos enlaces que sugieren que la implementación de iOS de System.Memory no está completa. Por ejemplo:
Esto significa que los proyectos de Xamarin ahora dependen de las implementaciones del paquete NuGet. Y el paquete NuGet de System.Memory versión 4.5.1 no incluye archivos de marcador de posición para los tipos de proyecto de Xamarin.
https://stackoverflow.com/questions/51296773/can-not-resolve-reference-system-memory-or-could-not-find-system-memory
davy.ai
Para resolver este problema, puedes intentar una o más de las siguientes soluciones:
Actualiza a la última versión de los paquetes Xamarin.iOS y SkiaSharp. Esto podría incluir correcciones a problemas relacionados con el uso de System.Memory.
Elimina la referencia a System.Memory en el proyecto .NET Standard. Si otras bibliotecas requieren una versión >= 4.5.4, es posible que debas considerar soluciones alternativas o soluciones temporales.
Utiliza una directiva de compilación condicional para excluir la referencia a System.Memory en el proyecto iOS. Puedes usar las declaraciones #if, #endif para verificar si el destino de compilación es iOS o una versión admitida de SkiaSharp, por ejemplo:
Modifica el código que llama a TextBlock.MeasuredHeight para usar un método o biblioteca diferente que no requiera System.Memory, si es posible.
Ponte en contacto con los desarrolladores de la biblioteca TopTen.RichTextKit o SkiaSharp para informar el problema y solicitar una solución o solución temporal. Es posible que puedan proporcionar una solución o sugerir enfoques alternativos.