es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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&lt;int&gt;,System.Span1<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

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para resolver este problema, puedes intentar una o más de las siguientes soluciones:

    1. 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.

    2. 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.

    3. 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:

    #if __IOS__ || SKIA_SHARP_VERSION <= 2.80.2
        // Excluir referencia a System.Memory
    #endif
    
    1. 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.

    2. 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.

Comments are closed.