Publicación de aplicaciones .NET para macOS

La publicación de aplicaciones .NET para macOS requiere varios pasos adicionales en comparación con otras plataformas, debido a los requisitos de seguridad de Apple.

Prerrequisitos

Antes de publicar la aplicación .NET para macOS, asegúrese de que tiene lo siguiente:

  • Cuenta de desarrollador de Apple: necesaria para la firma de código y la certificación.
  • Herramientas de línea de comandos de Xcode: proporciona codesign, altooly otras utilidades.
  • SDK de .NET: asegúrese de que tiene instalado el SDK de .NET más reciente.

Generación de una aplicación mediante el SDK de .NET

Use uno de los métodos descritos en la introducción a la publicación de aplicaciones .NET para generar una aplicación. Puede crear una aplicación dependiente del marco o independiente.

Firma y certificación de la aplicación

Use la documentación para desarrolladores de Apple para firmar y registrar los archivos binarios nativos de la aplicación. .NET crea un ejecutable nativo apphost como punto de entrada para tu aplicación. Este apphost debe estar firmado y, si la aplicación usa funcionalidades especiales, debe asignarse los derechos adecuados.

Derechos para aplicaciones que no se publican como Native AOT

Para las aplicaciones que no se publican como Nativo AOT, se requiere la com.apple.security.cs.allow-jit autorización.

Derechos para aplicaciones publicadas como AOT nativo

En el caso de las aplicaciones publicadas como AOT nativo, no se requieren derechos.

Permisos opcionales para la depuración y diagnósticos

Los siguientes derechos habilitan funcionalidades adicionales de depuración y diagnóstico:

  • com.apple.security.get-task-allow: necesario para la recolección de volcados con createdump y dotnet dump.
  • com.apple.security.cs.debugger: Necesario para conectar un depurador al proceso.

Advertencia

Si no se puede firmar y certificar la aplicación, es posible que la aplicación se bloquee mientras se ejecuta una operación restringida.

Archivos binarios universales

macOS admite archivos binarios universales: un único archivo Mach-O que contiene código de máquina para más de una arquitectura de CPU. macOS selecciona el segmento que coincide con el procesador actual, por lo que un archivo se ejecuta de forma nativa en equipos de apple silicon (arm64) e Intel (x64).

.NET no genera archivos binarios universales directamente. En su lugar, publica la aplicación una vez por arquitectura y combina los dos ejecutables nativos con la herramienta Apple lipo . Dos .NET modos de publicación producen un ejecutable nativo autocontenida que puede combinar de esta manera:

Publicación de un archivo binario universal de un solo archivo

Publique la aplicación una vez por arquitectura en directorios independientes:

dotnet publish -c Release -r osx-arm64 --self-contained true \
    -p:PublishSingleFile=true -o out/osx-arm64

dotnet publish -c Release -r osx-x64 --self-contained true \
    -p:PublishSingleFile=true -o out/osx-x64

A continuación, combine los dos ejecutables y vuelva a firmar el resultado:

mkdir -p out/universal
lipo -create -output out/universal/MyApp out/osx-arm64/MyApp out/osx-x64/MyApp
codesign --force --sign - out/universal/MyApp

Una publicación de un solo archivo independiente inserta el tiempo de ejecución, los ensamblados administrados y las bibliotecas nativas en el propio archivo ejecutable, por lo que el archivo combinado es la aplicación completa. El binario universal es aproximadamente la suma de las dos entradas.

Copie los archivos restantes de uno de los directorios de salida por arquitectura (por ejemplo, appsettings.json o archivos excluidos de la agrupación) junto al ejecutable combinado.

Publicación de un binario universal AOT nativo

Los pasos son los mismos que para un solo archivo, pero reemplazan las propiedades de un solo archivo por PublishAot:

dotnet publish -c Release -r osx-arm64 -p:PublishAot=true -o out/osx-arm64
dotnet publish -c Release -r osx-x64   -p:PublishAot=true -o out/osx-x64

mkdir -p out/universal
lipo -create -output out/universal/MyApp out/osx-arm64/MyApp out/osx-x64/MyApp
codesign --force --sign - out/universal/MyApp

AOT nativo genera una salida mucho menor que la publicación de un solo archivo, por lo que el binario universal también es pequeño.

AOT nativo también emite un MyApp.dSYM conjunto de símbolos de depuración por arquitectura. Para mantener los símbolos de ambos segmentos, mantenga los directorios por arquitectura o combine los DWARF archivos binarios dentro de las agrupaciones con lipo.