Alterações interruptivas no .NET Core 2.1

Se você estiver migrando para a versão 2.1 do .NET Core, as alterações interruptivas listadas neste artigo poderão afetar seu aplicativo.

Bibliotecas principais do .NET

As APIs de caminho não geram uma exceção para caracteres inválidos

As APIs que envolvem caminhos de arquivo não validam mais caracteres de caminho nem geram ArgumentException quando um caractere inválido é encontrado.

Descrição das alterações

No .NET Framework e no .NET Core 1.0 – 2.0, os métodos listados na seção APIs afetadas geram ArgumentException quando o argumento de caminho contém um caractere de caminho inválido. Do .NET Core 2.1 em diante, esses métodos não verificam mais se há caracteres de caminho inválidos nem geram uma exceção quando um caractere inválido é encontrado.

Motivo da alteração

A validação agressiva de caracteres de caminho bloqueia alguns cenários multiplataforma. Essa alteração foi introduzida para que o .NET não tente replicar nem prever o resultado das chamadas à API do sistema operacional. Para obter mais informações, confira a postagem no blog Novidade sobre o System.IO no .NET Core 2.1.

Versão introduzida

.NET Core 2.1

Se o código depende dessas APIs para verificar se há caracteres inválidos, você pode adicionar uma chamada a Path.GetInvalidPathChars.

APIs afetadas

Confira também


Campos privados adicionados a tipos de struct internos

Campos privados foram adicionados a determinados tipos de struct em assemblies de referência. Como resultado, em C#, sempre é necessário criar uma instância desses tipos de struct usando o operador new ou o literal padrão.

Descrição das alterações

No .NET Core 2.0 e nas versões anteriores, era possível criar uma instância de alguns tipos de struct fornecidos, por exemplo, ConsoleKeyInfo, sem usar o operador new ou o literal padrão em C#. Isso ocorria porque os assemblies de referência usados pelo compilador C# não continham os campos privados dos structs. Todos os campos privados de tipos de struct do .NET são adicionados aos assemblies de referência do .NET Core 2.1 em diante.

Por exemplo, o seguinte código C# é compilado no .NET Core 2.0, mas não no .NET Core 2.1:

ConsoleKeyInfo key;    // Struct type

if (key.ToString() == "y")
{
    Console.WriteLine("Yes!");
}

No .NET Core 2.1, o código anterior resultava no seguinte erro do compilador: CS0165 – Uso da variável local não atribuída 'key'

Versão introduzida

2.1

Crie instâncias de tipos de struct usando o operador new ou o literal padrão.

Por exemplo:

ConsoleKeyInfo key = new ConsoleKeyInfo();    // Struct type.

if (key.ToString() == "y")
    Console.WriteLine("Yes!");
ConsoleKeyInfo key = default;    // Struct type.

if (key.ToString() == "y")
    Console.WriteLine("Yes!");

Categoria

Bibliotecas principais do .NET

APIs afetadas


Versões do OpenSSL no macOS

O .NET Core 3.0 e os runtimes posteriores no macOS agora preferem as versões do OpenSSL 1.1.x a 1.0.x para os tipos AesCcm, AesGcm, DSAOpenSsl, ECDiffieHellmanOpenSsl, ECDsaOpenSsl, RSAOpenSsl e SafeEvpPKeyHandle.

O runtime do .NET Core 2.1 agora dá suporte a versões do OpenSSL 1.1.x, mas ainda prefere as versões do OpenSSL 1.0.x.

Descrição das alterações

Antes, o runtime do .NET Core usava as versões do OpenSSL 1.0.x no macOS para tipos que interagiam com o OpenSSL. A versão mais recente do OpenSSL 1.0.x, que é a OpenSSL 1.0.2, agora está sem suporte. Para manter os tipos que usam o OpenSSL em versões com suporte do OpenSSL, os runtimes do .NET Core 3.0 e posteriores agora usam versões mais recentes do OpenSSL no macOS.

Com essa alteração, o comportamento dos runtimes do .NET Core no macOS é o seguinte:

  • Os runtimes do .NET Core 3.0 e de versões posteriores usam o OpenSSL 1.1.x, se disponível, e retornam ao OpenSSL 1.0.x somente quando não há nenhuma versão 1.1.x disponível.

    Para chamadores que usam os tipos de interoperabilidade do OpenSSL com P/Invokes personalizados, siga as diretrizes nas observações de SafeEvpPKeyHandle.OpenSslVersion. O aplicativo poderá falhar se você não verificar o valor de OpenSslVersion.

  • O runtime do .NET Core 2.1 usa o OpenSSL 1.0.x, se disponível, e retorna ao OpenSSL 1.1.x quando não há nenhuma versão 1.0.x disponível.

    O runtime 2.1 prefere a versão anterior do OpenSSL porque a propriedade SafeEvpPKeyHandle.OpenSslVersion não existe no .NET Core 2.1, portanto, a versão do OpenSSL não pode ser determinada com confiança em tempo de execução.

Versão introduzida

  • .NET Core 2.1.16
  • .NET Core 3.0.3
  • .NET Core 3.1.2

Categoria

Bibliotecas principais do .NET

APIs afetadas


MSBuild

As ferramentas de projeto agora estão incluídas no SDK

O SDK do .NET Core 2.1 agora inclui ferramentas comuns da CLI e você não precisa mais fazer referência a essas ferramentas do projeto.

Descrição das alterações

No .NET Core 2.0, os projetos fazem referência a ferramentas externas do .NET com a configuração de projeto <DotNetCliToolReference>. No .NET Core 2.1, algumas dessas ferramentas são incluídas no SDK do .NET Core e a configuração não é mais necessária. Se você incluir referências a essas ferramentas no projeto, receberá um erro semelhante ao seguinte: A ferramenta 'Microsoft.EntityFrameworkCore.Tools.DotNet' agora está incluída no SDK do .NET Core.

Ferramentas agora incluídas no SDK do .NET Core 2.1:

<DotNetCliToolReference> value Ferramenta
Microsoft.DotNet.Watcher.Tools dotnet-watch
Microsoft.Extensions.SecretManager.Tools dotnet-user-secrets
Microsoft.Extensions.Caching.SqlConfig.Tools dotnet-sql-cache
Microsoft.EntityFrameworkCore.Tools.DotNet dotnet-ef

Versão introduzida

SDK do .NET Core 2.1.300

Remova a configuração <DotNetCliToolReference> do projeto.

Categoria

MSBuild

APIs afetadas

N/D


Confira também