Publicar aplicativos .NET para macOS

A publicação de aplicativos .NET para macOS requer várias etapas adicionais em comparação com outras plataformas, devido aos requisitos de segurança da Apple.

Pré-requisitos

Antes de publicar seu aplicativo .NET para macOS, verifique se você tem o seguinte:

  • Conta de desenvolvedor Apple: necessária para assinatura de código e reconhecimento de firma.
  • Xcode Command Line Tools: Fornece codesign, altoole outros utilitários.
  • SDK do .NET: verifique se você tem o SDK do .NET mais recente instalado.

Produza seu aplicativo usando o SDK do .NET

Use um dos métodos descritos na visão geral de publicação do aplicativo .NET para produzir um aplicativo. Você pode criar um aplicativo independente ou dependente da estrutura.

Assine e registre seu aplicativo

Use a documentação do desenvolvedor da Apple para assinar e registrar os binários nativos do aplicativo. O .NET cria um executável apphost nativo como o ponto de entrada para o seu aplicativo. Esse apphost deve ser assinado e, se seu aplicativo usa recursos especiais, ele deve receber os direitos apropriados.

Direitos para aplicações não publicadas como Nativo AOT

Para aplicações não publicadas como Nativo AOT, o com.apple.security.cs.allow-jit privilégio é necessário.

Direitos para aplicações publicadas como Nativo AOT

Para aplicativos publicados como AOT nativa, não são necessários direitos.

Permissões opcionais para depuração e diagnóstico

As seguintes permissões habilitam funcionalidades adicionais de depuração e diagnóstico:

  • com.apple.security.get-task-allow: Necessário para a coleta de despejo com createdump e dotnet dump.
  • com.apple.security.cs.debugger: Necessário para anexar um depurador ao processo.

Advertência

A falha ao assinar e autenticar seu aplicativo pode resultar na falha do aplicativo durante a execução de uma operação restrita.

Binários universais

O macOS suporta binários universais: um único ficheiro Mach-O que contém código máquina para mais do que uma arquitetura de CPU. O macOS seleciona a fatia que corresponde ao processador atual, de modo que um ficheiro corre nativamente tanto em Apple Silicon (arm64) como em máquinas Intel (x64).

O .NET não produz binários universais diretamente. Em vez disso, publica a sua aplicação uma vez por arquitetura e funde os dois executáveis nativos com a ferramenta Apple lipo . Dois modos de publicação .NET produzem um executável nativo autónomo que pode fundir desta forma:

Publicar um binário universal de ficheiro único

Publique a aplicação uma vez por arquitetura em diretórios separados:

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

Depois junta os dois executáveis e volta a assinar o 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

Uma publicação autónoma de ficheiro único incorpora o tempo de execução, os assemblies geridos e as bibliotecas nativas no próprio executável, pelo que o ficheiro fundido é a aplicação completa. O binário universal é aproximadamente a soma das duas entradas.

Copie quaisquer ficheiros restantes de um dos diretórios de saída por arquitetura (por exemplo, appsettings.json ou ficheiros excluídos do pacote) ao lado do executável fundido.

Publique um binário universal AOT nativo

Os passos são os mesmos do ficheiro único, mas substituam as propriedades do ficheiro único 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

O AOT nativo produz uma saída muito menor do que a publicação em ficheiro único, pelo que o binário universal também se mantém pequeno.

O AOT nativo também emite um MyApp.dSYM conjunto de símbolos de depuração por arquitetura. Para manter símbolos para ambas as fatias, manter os diretórios por arquitetura, ou fundir os DWARF binários dentro dos fibrados com lipo.