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 comofalse
, as propriedadesPublishSingleFile
de publicação ePublishAot
implicaram aRuntimeIdentifier
e, portanto,SelfContained
(se não foi especificado) durante as operações, incluindodotnet build
,dotnet restore
edotnet publish
. - A
PublishTrimmed
propriedade não implicavaSelfContained
. - A
PublishReadyToRun
propriedade implícitaSelfContained
seSelfContained
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 comofalse
, as propriedadesPublishSingleFile
de publicação ePublishAot
agora implicamSelfContained
(se não for especificado) durantedotnet publish
apenas (ou seja, não paradotnet build
oudotnet restore
). - A
PublishTrimmed
propriedade também implicaSelfContained
agora durantedotnet publish
. - A
PublishReadyToRun
propriedade não implicaSelfContained
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 SelfContained
explicitamente , 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.
Ação recomendada
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
comotrue
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>