Aplicativos específicos de tempo de execução não são mais autônomos

Aplicativos específicos de tempo de execução 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.

Esta é uma mudança significativa nas seguintes situações:

  • Se você implantou, distribuiu ou publicou seu aplicativo e não adicionou explicitamente a SelfContained propriedade, mas também não exigiu que o tempo de execução do .NET fosse instalado na máquina para que ele funcionasse. Nesse caso, você pode ter confiado no comportamento anterior para produzir um aplicativo autônomo por padrão.
  • Se você confia na ferramenta IL Link. Nesse caso, execute as etapas descritas em Ação recomendada para usar o IL Link novamente.

Comportamento anterior

Anteriormente, se um identificador de tempo de execução (RID) fosse especificado (via RuntimeIdentifier), o aplicativo era publicado como independente, mesmo SelfContained que não fosse explicitamente especificado.

Além disso:

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

Novo comportamento

A partir do .NET 8, para aplicativos destinados ao .NET 8 ou uma versão posterior, RuntimeIdentifier não implica SelfContained mais por padrão. Em vez disso, os aplicativos que especificam um identificador de tempo de execução dependem do tempo de execução do .NET por padrão (dependente da estrutura). Os aplicativos destinados 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 PublishSingleFile de publicação e PublishAot agora implicam SelfContained (se não for especificado) durante dotnet publish apenas (ou seja, não para dotnet build ou dotnet restore).
  • A PublishTrimmed propriedade também implica SelfContained agora durante dotnet publish.
  • A PublishReadyToRun propriedade não implica SelfContained mais se o projeto tem como destino o .NET 8 ou posterior.

Nota

Se você publicar usando msbuild /t:Publish e quiser que seu aplicativo seja independente, deverá especificar SelfContainedexplicitamente , mesmo que seu projeto tenha uma das propriedades de publicação listadas.

Versão introduzida

.NET 8 Visualização 5

Tipo de mudança de rutura

Essa alteração pode afetar a compatibilidade de origem e a compatibilidade binária.

Razão para a alteração

  • O novo comportamento do SDK do .NET se alinha com o comportamento do Visual Studio.
  • Os aplicativos dependentes da estrutura são menores por padrão, já que não há cópias do .NET armazenadas em cada aplicativo.
  • Quando o .NET é gerenciado fora do aplicativo (ou seja, para implantações dependentes da estrutura), o .NET permanece mais seguro e atualizado. Os aplicativos que têm sua própria cópia do tempo de execução não recebem atualizações de segurança. Essa alteração torna mais aplicativos dependentes da estrutura por padrão.
  • Idealmente, as opções de linha de comando são ortogonais. Nesse caso, as ferramentas suportam a implantação autônoma (SCD) específica do RID e a implantação dependente da estrutura específica do RID (FDD). Portanto, não fazia sentido que nenhum RID ficasse inadimplente com FDD e RID com SCD. Esse comportamento era muitas vezes confuso para os usuários.

O .NET 6 alertou os usuários sobre essa alteração de quebra com o seguinte aviso:

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

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

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

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

    Siga as orientações do aviso e declare seu aplicativo como independente. Você pode fazer isso no arquivo de projeto 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 da mesma maneira descrita anteriormente.

Definir propriedade de arquivo de projeto

SelfContained é uma propriedade MSBuild que você pode inserir em seu arquivo de projeto, que é um arquivo que tem uma extensão .csproj, .vbproj ou .fsproj . Defina a propriedade da seguinte maneira:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    ...
    <SelfContained>true</SelfContained>
  </PropertyGroup>
</Project>

Consulte também