Aplicativos específicos de runtime não são mais autônomos

Aplicativos específicos de runtime, ou aplicativos .NET com um RuntimeIdentifier, não são mais autônomos por padrão. Em vez disso, eles são dependentes da estrutura por padrão.

Essa é uma alteração interruptiva nas seguintes situações:

  • Se você implantou, distribuiu ou publicou seu aplicativo e não adicionou explicitamente a propriedade SelfContained, mas também não exigiu que o runtime do .NET fosse instalado no computador para que ele funcionasse. Nesse caso, você pode ter confiado no comportamento anterior para produzir um aplicativo autônomo por padrão.

  • Se você depender da ferramenta de Link IL. Nesse caso, você precisará executar as etapas descritas em Ação recomendada para usar o Link IL novamente.

Comportamento anterior

Anteriormente, se um RID (identificador de runtime) fosse especificado (via RuntimeIdentifier), o aplicativo era publicado como autônomo, mesmo que SelfContained não fosse especificado explicitamente.

Além disso:

  • Se PublishSelfContained não foi definido explicitamente como false, as propriedades de publicação PublishSingleFile e PublishAot implicaram um RuntimeIdentifier e, portanto SelfContained, (se não foi especificado) durante operações, incluindo dotnet build, dotnet restore e dotnet publish.
  • A propriedade PublishTrimmed não implicava SelfContained.
  • A propriedade PublishReadyToRun implicavaSelfContained se SelfContained não fosse especificada.

Novo comportamento

A partir do .NET 8, para aplicativos direcionados ao .NET 8 ou a uma versão posterior, RuntimeIdentifier não implica mais SelfContained por padrão. Em vez disso, os aplicativos que especificam um identificador de runtime dependerão do runtime do .NET por padrão (dependente da estrutura). Aplicativos direcionados ao .NET 7 ou versões anteriores não são afetados.

Além disso:

  • Se PublishSelfContained não estiver explicitamente definido como false, as propriedades de publicação PublishSingleFile e PublishAot agora implicarão SelfContained (se não for especificado) somente durante dotnet publish (ou seja, não para dotnet build ou dotnet restore).
  • A propriedade PublishTrimmed agora também implica SelfContained durante dotnet publish.
  • A propriedade PublishReadyToRun não implica mais SelfContained quando o projeto tem como destino o .NET 8 ou posterior.

Observação

Se você publicar usando msbuild /t:Publish e desejar que seu aplicativo seja autônomo, deverá especificar explicitamente SelfContained, mesmo que seu projeto tenha uma das propriedades de publicação listadas.

Versão introduzida

.NET 8 versão prévia 5

Tipo de alteração interruptiva

Essa alteração pode afetar a compatibilidade com binários e a compatibilidade com a origem.

Motivo da alteração

  • O novo comportamento do SDK do .NET está alinhado com o comportamento do Visual Studio.
  • Os aplicativos dependentes da estrutura são menores por padrão, pois não há cópias do .NET armazenadas em cada aplicativo.
  • Quando o .NET é gerenciado fora do aplicativo (ou seja, para implantações dependentes de estrutura), o .NET permanece mais seguro e atualizado. Os aplicativos que têm sua própria cópia do runtime não recebem atualizações de segurança. Essa alteração torna mais aplicativos dependentes da estrutura por padrão.
  • O ideal é que as opções de linha de comando sejam ortogonais. Nesse caso, o conjunto de ferramentas dá suporte à SCD (implantação autônoma) específica de RID e à FDD (implantação dependente de estrutura) específica de RID. Portanto, não fazia sentido que nenhum RID fosse padronizado para FDD e nenhum RID fosse padronizado para SCD. Esse comportamento geralmente era confuso para os usuários.

O .NET 6 alertava os usuários sobre essa alteração interruptiva com o seguinte aviso:

aviso NETSDK1179: uma das opções'--self-contained' ou '--no-self-contained' é necessária quando '--runtime ' é usado.

Agora que os clientes tiveram tempo de adicionar SelfContained explicitamente, não há problema em introduzir a pausa.

  • Se você estiver usando o .NET 7 ou uma versão anterior e se baseou no comportamento anterior em que SelfContained foi inferido, verá este aviso:

    Para projetos com TargetFrameworks >= 8.0, RuntimeIdentifier não fornece mais automaticamente um aplicativo SelfContained. Para continuar criando um aplicativo independente da estrutura do .NET após a atualização para o 8.0, considere definir SelfContained explicitamente.

    Siga as diretrizes do aviso e defina SelfContained como true no arquivo de projeto (<SelfContained>true</SelfContained>) ou como um argumento de linha de comando, por exemplo, dotnet publish --self-contained.

  • Se você estiver usando o .NET 8 e quiser manter o comportamento anterior, defina SelfContained como true.

Confira também