Xamarin

Importante

Visual Studio App Center está programado para retirarse el 31 de marzo de 2025. Aunque puede seguir usando Visual Studio App Center hasta que se retire por completo, hay varias alternativas recomendadas a las que puede considerar la posibilidad de migrar.

Obtenga más información sobre las escalas de tiempo y las alternativas de soporte técnico.

Mi compilación de Xamarin.iOS se compila a partir del archivo de solución (.sln) en lugar del archivo de proyecto (.csproj)

Cuando las compilaciones de Xamarin.iOS se ejecutan desde el archivo de solución (.sln), es posible que desee comprobar varias cosas.

Los proyectos de Android y UWP deben deshabilitarse en el código para configuraciones de compilación diseñadas para compilaciones de iOS. Vaya a las asignaciones de configuración de la solución y, para todas las asignaciones destinadas a iPhone y iPhoneSimulator, desactive todos los proyectos destinados a distintas plataformas. Esta configuración garantiza que cuando comience la .sln compilación, no intentará compilar otros proyectos.

Mis compilaciones de Xamarin.iOS producen un error al reclamar que necesito proporcionar información de firma.

Si las compilaciones de Xamarin.iOS no están firmadas, pero el proceso de compilación requiere firma, es probable que se deba a que ha seleccionado Sign builds: Off en la configuración de la rama de App Center.

Si el registro de compilación contiene:

RequireProvisioningProfile: True. 

Significa que el propio proyecto está configurado para firmar y aplica la firma a pesar de la configuración de App Center.

Para corregirlo, abra Project Options > Build > iOS Bundle Signing en el IDE y asegúrese de que la configuración del proyecto (por ejemplo, Depurar|iPhoneSimulator) no contiene ninguna información de firma que no sea Automatic.

Error en la compilación de Xamarin.Android con error: no se encontraron archivos APK.

Una razón común por la que se produce un error de compilación durante la tarea Postprocess de Xamarin Android es un valor incorrecto en la <OutputPath> propiedad del archivo de proyecto de Android. Para comprobarlo, vaya a Xamarin.Android Project Options Build > Output (Salida de compilación de opciones > del proyecto de Xamarin.Android>) y compruebe que la configuración de compilación (Depuración o versión) apunta a la ubicación predeterminada. Normalmente, debe ser YourProjectDir/bin/$(Configuration).

He configurado mi rama de aplicación de Xamarin.iOS para compilar sin firmar, pero mi compilación no ha podido reclamar que necesito proporcionar la información de firma.

Si seleccionó Sign builds: Off en la configuración de la rama de App Center y el registro de compilación contiene RequireProvisioningProfile: True, significa que el propio proyecto está configurado para la firma e intentará aplicar la firma a pesar de la configuración de App Center. Para corregirlo, abra Project Options > Build iOS Bundle Signing in your IDE (Opciones de proyecto Build > iOS Bundle Signing in your IDE) y asegúrese de que la configuración del proyecto (por ejemplo, Debug|iPhoneSimulator) no contiene ninguna información de firma distinta de Automatic.

Deshabilitación de la firma para la configuración de depuración en la aplicación de Xamarin.iOS

Mi compilación del simulador de Xamarin.iOS no se puede instalar en el simulador de iOS con el error "Failed to chmod ... /Appname.iOS.app/Appname.iOS : No such file or directory" (No se pudo instalar en el simulador de iOS).

Al crear un proyecto de Xamarin.iOS en Visual Studio, la configuración predeterminada para iPhoneSimulator tiene arquitecturas compatibles con i386 + x86_64 . El archivo .app que se compila a partir de dicha configuración no se cargará en un simulador. Abra Opciones > de proyecto Build > iOS Build and for iPhoneSimulator configuration change Supported architectures to i386 or x86_64.

Establezca x86_64 en Supported Architectures for iPhoneSimulator configuration in Xamarin.iOS application

Se produce un error en la compilación de Xamarin con el error MSB4018: Error inesperado en la tarea "WriteRestoreGraphTask".

Parece que la solución contiene proyectos PCL o anteriores de .NET Standard junto con proyectos de .NET Standard más recientes. Esto significa que pueden contener referencias PackageTargetFallback y AssetTargetFallback en .csproj archivos. Los registros de compilación también contendrán mensajes como los siguientes:

error MSB4018: NuGet.Commands.RestoreCommandException: PackageTargetFallback and AssetTargetFallback cannot be used together. Remove PackageTargetFallback(deprecated) references from the project environment.

Para resolver este problema, quite PackageTargetFallback (tiende a estar en archivos PCL .csproj más antiguos) o cámbiele el nombre a AssetTargetFallback? La solución también se describe en este subproceso stackOverflow.

Se produce un error en la compilación de Xamarin: este proyecto hace referencia a paquetes NuGet que faltan en este equipo.

Parece que no se restauraron todos los paquetes para compilar la aplicación. Los registros de compilación también contendrán mensajes como estos:

warning MSB3245: Could not resolve this reference. Could not locate the assembly "ASSEMBLY_NAME". Check to make sure the assembly exists on disk. If this reference is required by your code, you may get compilation errors.
error CS0246: The type or namespace name 'TYPE_OR_NAMESPACE_NAME' could not be found (are you missing a using directive or an assembly reference?)

Para resolver este problema, puede usar el scriptappcenter-pre-build.sh anterior a la compilación con los siguientes comandos, que restaura todos los paquetes de cada solución del repositorio:

#!/bin/bash
find $APPCENTER_SOURCE_DIRECTORY -name '*.sln' -print0 | xargs -0 -n1 nuget restore -DisableParallelProcessing

Quiero ejecutar pruebas unitarias para mi aplicación de Xamarin

Para ejecutar pruebas unitarias en las compilaciones de Xamarin, use un script posterior a la compilación. Por ejemplo, cuando el proyecto basado en NUnit tiene Test en el nombre, puede usar el siguiente script para compilar, ejecutar y mostrar los resultados:

echo "Found NUnit test projects:"
find $APPCENTER_SOURCE_DIRECTORY -regex '.*Test.*\.csproj' -exec echo {} \;
echo
echo "Building NUnit test projects:"
find $APPCENTER_SOURCE_DIRECTORY -regex '.*Test.*\.csproj' -exec msbuild {} \;
echo
echo "Compiled projects to run NUnit tests:"
find $APPCENTER_SOURCE_DIRECTORY -regex '.*bin.*Test.*\.dll' -exec echo {} \;
echo
echo "Running NUnit tests:"
find $APPCENTER_SOURCE_DIRECTORY -regex '.*bin.*Test.*\.dll' -exec nunit3-console {} \;
echo
echo "NUnit tests result:"
find . -name 'TestResult.xml' -exec cat {} \;

Obtengo un error: No se encontraron proyectos y No se encontraron configuraciones para compilaciones de Xamarin

Podría ser un problema de la profundidad del repositorio en la que se encuentran y .csproj.sln . Hay una limitación en el analizador actual debido a motivos de rendimiento.

En .csproj el caso de los archivos, no debe ser inferior a cuatro directorios en profundidad, incluida la raíz del repositorio.

En .sln el caso de los archivos, no debe ser inferior a dos directorios en profundidad, incluida la raíz del repositorio.

Cómo restaurar una fuente nuGet privada?

Si el archivo NuGet.Config está protegido en el repositorio y se encuentra junto al .sln o en el nivel raíz del repositorio, App Center restaura las fuentes de NuGet privadas cuando se agregan como se muestra en el ejemplo siguiente. Las credenciales se pueden agregar de forma segura mediante variables de entorno.

En el caso de las máquinas de compilación de Mac:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <packageSources>
    <add key="nuget" value="https://api.nuget.org/v3/index.json" />
    <add key="MyGet" value="https://www.myget.org/F/MyUsername/api/v2/index.json" />
    <add key="MyAuthNuget" value="https://nuget.example.com/v2/index.json" />
  </packageSources>
  <activePackageSource>
    <add key="All" value="(Aggregate source)" />
  </activePackageSource>
  <packageSourceCredentials>
    <MyAuthNuget>
      <add key="Username" value="%USER_VARIABLE%" />
      <add key="ClearTextPassword" value="%PASSWORD_VARIABLE%" />
    </MyAuthNuget>
  </packageSourceCredentials>
</configuration>

Para las máquinas de compilación de Windows, consulta UWP C#.

Si tiene configuraciones complejas y necesita más información, puede consultar Configuración del comportamiento de NuGet.

Compilaciones bloqueadas en CompileToNative

Si la compilación experimenta síntomas similares como se describe en este problema de GitHub, intente compilar solo para ARM64 agregando el siguiente argumento, como se sugiere en el problema:

<MtouchArch>ARM64</MtouchArch>

Error de compilación: el destino "_IsProjectRestoreSupported" no existe en el proyecto.

Puedes experimentar problemas de compilación si tienes un proyecto de UWP en la solución en la que durante la restauración sus errores se omitieron silenciosamente en la versión anterior de NuGet. Quitar o corregir este proyecto de UWP en la solución puede resolver el problema. Plese consulte los detalles de este problema de GitHub.