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 da Apple: necessária para assinatura de código e autenticação em cartório.
  • Ferramentas de Linha de Comando Xcode: Fornece , codesign, e outros utilitários.
  • SDK do .NET: verifique se você tem o SDK do .NET mais recente instalado.

Produzir seu aplicativo usando o SDK do .NET

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

Assinar e autenticar seu aplicativo em cartório

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

Privilégios para aplicativos não publicados como Nativo AOT

Para aplicativos não publicados como AOT Nativo, é necessária a autorização com.apple.security.cs.allow-jit.

Direitos para aplicativos publicados como Nativo AOT

Para aplicativos publicados como nativo AOT, nenhuma permissão é necessária.

Direitos opcionais para depuração e diagnóstico

Os direitos a seguir habilitam recursos adicionais de depuração e diagnóstico:

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

Aviso

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 dá suporte a binários universais: um único arquivo Mach-O que contém código do computador para mais de uma arquitetura de CPU. O macOS seleciona a fatia que corresponde ao processador atual, portanto, um arquivo é executado nativamente em computadores Apple silicon (arm64) e Intel (x64).

.NET não produz binários universais diretamente. Em vez disso, você publica seu aplicativo uma vez por arquitetura e mescla os dois executáveis nativos com a ferramenta apple lipo . Dois modos de publicação .NET produzem um executável nativo independente que você pode mesclar dessa maneira:

Publicar um binário universal de arquivo único

Publique o aplicativo 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

Em seguida, mescle os dois executáveis e assine novamente 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 de arquivo único autocontida inscreve o runtime, os assemblies gerenciados e as bibliotecas nativas no próprio executável, portanto, o arquivo mesclado é o aplicativo completo. O binário universal é aproximadamente a soma das duas entradas.

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

Publicar um binário universal AOT nativo

As etapas são as mesmas do arquivo único, mas substituem as propriedades de arquivo ú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 de arquivo único, portanto, o binário universal também permanece pequeno.

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