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 comofalse
, as propriedades de publicaçãoPublishSingleFile
ePublishAot
implicaram umRuntimeIdentifier
e, portantoSelfContained
, (se não foi especificado) durante operações, incluindodotnet build
,dotnet restore
edotnet publish
. - A propriedade
PublishTrimmed
não implicavaSelfContained
. - A propriedade
PublishReadyToRun
implicavaSelfContained
seSelfContained
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 comofalse
, as propriedades de publicaçãoPublishSingleFile
ePublishAot
agora implicarãoSelfContained
(se não for especificado) somente durantedotnet publish
(ou seja, não paradotnet build
oudotnet restore
). - A propriedade
PublishTrimmed
agora também implicaSelfContained
durantedotnet publish
. - A propriedade
PublishReadyToRun
não implica maisSelfContained
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.
Ação recomendada
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 declare seu aplicativo como sistema autônomo. 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
comotrue
da mesma maneira descrita anteriormente.
Definir a propriedade do arquivo de projeto
SelfContained
é uma propriedade MSBuild que você pode inserir no arquivo de projeto, que é um arquivo que tem uma extensão .csproj, .vbprojou .fsproj. Defina a propriedade da seguinte maneira:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
...
<SelfContained>true</SelfContained>
</PropertyGroup>
</Project>