Visão geral da publicação de aplicativos .NET

Os aplicativos criados com o .NET podem ser publicados em dois modos diferentes, e o modo afeta a forma como um usuário executa o aplicativo.

A publicação do seu aplicativo como autossuficiente produz um aplicativo que inclui o runtime e as bibliotecas do .NET, bem como seu aplicativo e as respectivas dependências. Os usuários do aplicativo podem executá-lo em um computador que não tenha o runtime do .NET instalado.

A publicação do seu aplicativo como dependente de estrutura produz um aplicativo que inclui apenas o próprio aplicativo e suas dependências. Os usuários do aplicativo precisam instalar separadamente o runtime do .NET.

Ambos os modos de publicação produzem um arquivo executável específico da plataforma por padrão. Aplicativos dependentes de estrutura podem ser criados sem um arquivo executável e esses aplicativos são multiplataforma.

Quando um arquivo executável é produzido, você pode especificar a plataforma de destino com um RID (identificador de runtime). Para obter mais informações sobre RIDs, consulte Catálogo de RID do .NET.

A tabela a seguir descreve os comandos usados para publicar um aplicativo como dependente de estrutura ou autossuficiente, por versão do SDK:

Tipo SDK 2.1 SDK 3.1 SDK 5.0 SDK 6.0 Comando
arquivo executável dependente de estrutura para a plataforma atual. ✔️ ✔️ ✔️ dotnet publish
arquivo executável dependente de estrutura para uma plataforma específica. ✔️ ✔️ ✔️ dotnet publish -r <RID> --self-contained false
binário multiplataforma dependente de estrutura. ✔️ ✔️ ✔️ ✔️ dotnet publish
arquivo executável autônomo. ✔️ ✔️ ✔️ ✔️ dotnet publish -r <RID>

Para obter mais informações, consulte Comando dotnet publish do .NET.

Produzir um arquivo executável

Os arquivos executáveis não são multiplataforma. Eles são específicos de um sistema operacional e arquitetura de CPU. Ao publicar seu aplicativo e criar um arquivo executável, você pode publicar o aplicativo como autossuficiente ou dependente de estrutura. A publicação de um aplicativo como autossuficiente inclui o runtime do .NET com o aplicativo e seus usuários não precisam instalar o .NET antes de executá-lo. Os aplicativos publicados como dependentes da estrutura não incluem o runtime e as bibliotecas do .NET; somente o aplicativo e as dependências de terceiros estão incluídos.

Os seguintes comandos produzem um arquivo executável:

Tipo SDK 2.1 SDK 3.1 SDK 5.0 SDK 6.0 Comando
arquivo executável dependente de estrutura para a plataforma atual. ✔️ ✔️ ✔️ dotnet publish
arquivo executável dependente de estrutura para uma plataforma específica. ✔️ ✔️ ✔️ dotnet publish -r <RID> --self-contained false
arquivo executável autônomo. ✔️ ✔️ ✔️ ✔️ dotnet publish -r <RID>

Produzir um binário multiplataforma

Binários multiplataforma são criados quando você publica seu aplicativo como dependente de estrutura na forma de um arquivo dll. O arquivo dll recebe o nome do projeto. Por exemplo, se você tiver um aplicativo chamado word_reader, um arquivo chamado word_reader.dll será criado. Os aplicativos publicados dessa forma são executados com o comando dotnet <filename.dll> e podem ser executados em qualquer plataforma.

Binários multiplataforma podem ser executados em qualquer sistema operacional, desde que o runtime do .NET de destino já esteja instalado. Se o runtime do .NET de destino não estiver instalado, o aplicativo poderá ser executado usando um runtime mais recente se o aplicativo estiver configurado para efetuar roll forward. Para obter mais informações, consulte roll forward de aplicativos dependentes de estrutura.

O comando a seguir produz um binário multiplataforma:

Tipo SDK 2.1 SDK 3.x SDK 5.0 SDK 6.0 Comando
binário multiplataforma dependente de estrutura. ✔️ ✔️ ✔️ ✔️ dotnet publish

Publicar dependente de estrutura

Os aplicativos publicados como dependentes de estrutura são multiplataforma e não incluem o runtime do .NET. O usuário do seu aplicativo deve instalar o runtime do .NET.

A publicação de um aplicativo como dependente de estrutura produz um binário multiplataforma como um arquivo dll e um arquivo executável específico da plataforma direcionado à plataforma atual. A dll é multiplataforma enquanto o arquivo executável não é. Por exemplo, se você publicar um aplicativo chamado word_reader e direcionar ao Windows, um arquivo executável word_reader.exe será criado junto com word_reader.dll. Ao direcionar para o Linux ou macOS, um arquivo executável word_reader é criado junto com word_reader.dll. Para obter mais informações sobre RIDs, consulte Catálogo de RID do .NET.

Importante

O SDK 2.1 do .NET não produz arquivos executáveis específicos da plataforma quando você publica um aplicativo dependente de estrutura.

O binário multiplataforma do seu aplicativo pode ser executado com o comando dotnet <filename.dll> e em qualquer plataforma. Se o aplicativo usar um pacote NuGet que tenha implementações específicas da plataforma, todas as dependências das plataformas serão copiadas para a pasta de publicação junto com o aplicativo.

Você pode criar um arquivo executável para uma plataforma específica passando os parâmetros -r <RID> --self-contained false para o comando dotnet publish. Quando o parâmetro -r é omitido, um arquivo executável é criado para sua plataforma atual. Todos os pacotes NuGet que têm dependências específicas da plataforma para a plataforma de destino são copiados para a pasta de publicação. Se você não precisar de um arquivo executável específico da plataforma, poderá especificar <UseAppHost>False</UseAppHost> no arquivo de projeto. Para obter mais informações, consulte a Referência do MSBuild para projetos do SDK do .NET.

Vantagens

  • Implantação pequena
    Somente seu aplicativo e suas dependências são distribuídos. O runtime e as bibliotecas do .NET são instalados pelo usuário e todos os aplicativos compartilham o runtime.

  • Plataforma cruzada
    Seu aplicativo e qualquer biblioteca baseada em .NET é executada em outros sistemas operacionais. Não é necessário definir uma plataforma de destino para seu aplicativo. Para obter informações sobre o formato de arquivo .NET, consulte Formato de Arquivo do Assembly .NET.

  • Usa o runtime corrigido mais recente
    O aplicativo usa o runtime mais recente (dentro da família principal-secundária de destino do .NET) instalado no sistema de destino. Isso significa que seu aplicativo usa automaticamente a versão mais recente corrigida do runtime do .NET. Esse comportamento padrão pode ser substituído. Para obter mais informações, consulte roll forward de aplicativos dependentes de estrutura.

Desvantagens

  • Requer a pré-instalação do runtime
    Seu aplicativo poderá ser executado somente se a versão do .NET que seu aplicativo visa já estiver instalada no sistema host. Você pode configurar o comportamento de roll-forward para o aplicativo exigir uma versão específica do .NET ou permitir uma versão mais recente do .NET. Para obter mais informações, consulte roll forward de aplicativos dependentes de estrutura.

  • O .NET pode ser alterado
    É possível que o runtime do .NET e as bibliotecas sejam atualizados no computador em que o aplicativo é executado. Em casos raros, isso poderá alterar o comportamento do aplicativo se você usar as bibliotecas .NET, o que a maioria dos aplicativos faz. Você pode configurar como seu aplicativo usa as versões mais recentes do .NET. Para obter mais informações, consulte roll forward de aplicativos dependentes de estrutura.

A desvantagem a seguir só se aplica ao SDK do .NET Core 2.1.

  • Use o comando dotnet para iniciar o aplicativo
    Os usuários devem executar o comando dotnet <filename.dll> para iniciar o aplicativo. O SDK do .NET Core 2.1 não produz arquivos executáveis específicos da plataforma para aplicativos que dependem da estrutura publicada.

Exemplos

Publicar um aplicativo dependente de estrutura multiplataforma. Um arquivo executável direcionado à plataforma atual é criado junto com o arquivo dll.

dotnet publish

Publicar um aplicativo dependente de estrutura multiplataforma. Um arquivo executável de 64 bits do Linux é criado junto com o arquivo dll. Esse comando não funciona com o SDK do .NET Core 2.1.

dotnet publish -r linux-x64 --self-contained false

Publicar como autossuficiente

A publicação do aplicativo como autossuficiente produz um arquivo executável específico da plataforma. A pasta de publicação de saída contém todos os componentes do aplicativo, incluindo as bibliotecas .NET e o runtime de destino. O aplicativo é isolado de outros aplicativos .NET e não usa um runtime compartilhado instalado localmente. O usuário do aplicativo não precisa baixar e instalar o .NET.

O binário executável é produzido para a plataforma de destino especificada. Por exemplo, se você tiver um aplicativo chamado word_reader e publicar um arquivo executável autossuficiente para Windows, um arquivo word_reader.exe será criado. Na publicação para Linux ou macOS, um arquivo word_reader é criado. A plataforma e a arquitetura de destino são especificadas com o parâmetro -r <RID> para o comando dotnet publish. Para obter mais informações sobre RIDs, consulte Catálogo de RID do .NET.

Se o aplicativo tiver dependências específicas da plataforma, como um pacote NuGet que contém dependências específicas da plataforma, elas serão copiadas para a pasta de publicação junto com o aplicativo.

Vantagens

  • Controlar a versão do .NET
    Você controla qual versão do .NET é implantada com o aplicativo.

  • Direcionamento específico da plataforma
    Como você precisa publicar seu aplicativo para cada plataforma, você sabe onde ele será executado. Se o .NET introduzir uma nova plataforma, os usuários não poderão executar o aplicativo nessa plataforma até que você libere uma versão direcionada a ela. Você pode testar seu aplicativo para problemas de compatibilidade antes que os usuários executem seu aplicativo na nova plataforma.

Desvantagens

  • Implantações maiores
    Como seu aplicativo inclui o runtime do .NET e todas as dependências do aplicativo, o tamanho do download e o espaço necessário para disco rígido são maiores do que uma versão dependente de estrutura.

    Dica

    Você pode reduzir o tamanho da sua implantação em sistemas Linux em aproximadamente 28 MB usando o modo invariável de globalização do .NET. Isso força o aplicativo a tratar todas as culturas como a cultura invariável.

    Dica

    O corte IL pode reduzir ainda mais o tamanho da implantação.

  • É mais difícil atualizar a versão do .NET
    O Runtime do .NET (distribuído com o aplicativo) só pode ser atualizado liberando uma nova versão do aplicativo. No entanto, o .NET atualizará patches de segurança críticos conforme necessário para a biblioteca de estruturas no computador em que seu aplicativo é executado. Você é responsável pela validação de ponta a ponta para esse cenário de patch de segurança.

Exemplos

Publique um aplicativo autônomo. Um arquivo executável de 64 bits do macOS é criado.

dotnet publish -r osx-x64

Publique um aplicativo autônomo. Um arquivo executável de 64 bits do Windows é criado.

dotnet publish -r win-x64

Publicar com imagens ReadyToRun

A publicação com imagens ReadyToRun melhorará o tempo de inicialização do aplicativo aumentando o tamanho do aplicativo. Para publicar com ReadyToRun, consulte ReadyToRun para obter mais detalhes.

Vantagens

  • Tempo de inicialização aprimorado
    O aplicativo gastará menos tempo executando o JIT.

Desvantagens

  • Tamanho maior
    O aplicativo será maior no disco.

Exemplos

Publique um aplicativo autônomo e ReadyToRun. Um arquivo executável de 64 bits do macOS é criado.

dotnet publish -c Release -r osx-x64 -p:PublishReadyToRun=true

Publique um aplicativo autônomo e ReadyToRun. Um arquivo executável de 64 bits do Windows é criado.

dotnet publish -c Release -r win-x64 -p:PublishReadyToRun=true

Confira também