Actualización de aplicaciones unificadas de Xamarin.Mac a 64 bits
Desde enero de 2018, Apple exige que los nuevos envíos de Mac App Store tengan como destino 64 bits. Las aplicaciones que ya están disponibles en Mac App Store se deben actualizar para tener como destino 64 bits antes de junio de 2018.
La plantilla de proyecto Archivo>Nuevo Xamarin.Mac crea aplicaciones de 64 bits de manera predeterminada, por lo que las aplicaciones creadas recientemente ya son compatibles con 64 bits y no necesitarán ningún cambio.
Destino de 64 bits
Abra la ventana Opciones del proyecto para la aplicación de Xamarin.Mac:
Seleccione Compilación de Mac y establezca Arquitecturas admitidas en x86_64:
Si la aplicación tiene dependencias externas, como referencias nativas o proyectos de enlace, actualícelas a destinos de 64 bits.
Errores
La primera vez que compile o ejecute la aplicación con compatibilidad de 64 bits, se pueden producir errores de vínculo de problemas de clang o runtime. Estos errores se pueden producir si las dependencias de terceros (por ejemplo, las referencias nativas en los proyectos de Xamarin.Mac o enlaces, o marcos de trabajo de todo el sistema cargados manualmente) no se han actualizado a 64 bits.
Sugerencia
La conversión del proyecto a 64 bits es un cambio importante y puede descubrir indirectamente varios errores de programación. En concreto, puede cambiar el tamaño y la alineación de las estructuras de datos, lo que afectaría a las firmas p/invoke y al código nativo vinculado en el proyecto. Considere la posibilidad de revisar las advertencias de compilación dadas y pruebe la aplicación exhaustivamente después para detectar posibles problemas.
Error de ejemplo resultante de una dependencia de terceros vinculada dinámicamente que no tiene como destino 64 bits:
ld : warning : ignoring file PATH/ThirdPartyLibrary.framework/ThirdPartyLibrary,
file was built for i386 which is not the architecture being linked (x86_64):
PATH/ThirdPartyLibrary.framework/ThirdPartyLibrary
Este error se puede seguir en tiempo de ejecución si dlopen
devuelve IntPtr.Zero
en lugar de un identificador esperado.
Error de ejemplo resultante de una dependencia de terceros vinculada estáticamente que no tiene como destino 64 bits:
Undefined symbols for architecture x86_64:
"_LibraryFunction", referenced from:
-u command line option
ld: symbol(s) not found for architecture x86_64
Para que la compilación y la ejecución sean correctas, actualice estas dependencias a 64 bits y vuelva a compilar la aplicación.