Alterações de runtime para migração para o .NET Framework 4.7.x

Este artigo lista os problemas de compatibilidade do aplicativo introduzidos no .NET Framework 4.7, 4.7.1 e 4.7.2.

.NET Framework 4.7

JIT

Geração de código incorreta ao passar e comparar valores UInt16

Detalhes

Devido às alterações introduzidas no .NET Framework 4.7, em alguns casos, o código gerado pelo compilador JIT em aplicativos em execução no .NET Framework 4.7 compara incorretamente dois T:System.UInt16 valores. Para obter mais informações, consulte o Problema nº 11508: geração de código incorreta e silenciosa ao passar e comparar argumentos ushort em GitHub.com.

Sugestão

Se você encontrar problemas na comparação de valores sem sinal de 16 bits no .NET Framework 4.7, atualize para o .NET Framework 4.7.1.

Nome Valor
Scope Edge
Versão 4.7
Tipo Tempo de execução

APIs afetadas

Não detectável por meio da análise de API.

Windows Presentation Foundation (WPF)

Falha no Seletor ao remover um item de uma coleção INCC personalizada

Detalhes

Um T:System.InvalidOperationException pode ocorrer no seguinte cenário:

  • O ItemsSource para um T:System.Windows.Controls.Primitives.Selector é uma coleção com uma implementação personalizada de T:System.Collections.Specialized.INotifyCollectionChanged.
  • O item selecionado é removido da coleção.
  • O T:System.Collections.Specialized.NotifyCollectionChangedEventArgs tem P:System.Collections.Specialized.NotifyCollectionChangedEventArgs.OldStartingIndex = -1 (indicando uma posição desconhecida).

A pilha de chamadas da exceção começa at System.Windows.Threading.Dispatcher.VerifyAccess() at System.Windows.DependencyObject.GetValue(DependencyProperty dp) at System.Windows.Controls.Primitives.Selector.GetIsSelected(DependencyObject element). Essa exceção poderá ocorrer no .NET Framework 4.5 se o aplicativo tiver mais de um thread do Dispatcher. No .NET Framework 4.7, a exceção também pode ocorrer em aplicativos com um único thread do Dispatcher.

O problema foi corrigido no .NET Framework 4.7.1.

Sugestão

Atualize para o .NET Framework 4.7.1.

Nome Valor
Scope Menor
Versão 4.7
Tipo Tempo de execução

APIs afetadas

Não detectável por meio da análise de API.

DataGridCellsPanel.BringIndexIntoView lança ArgumentOutOfRangeException

Detalhes

ScrollIntoView(Object) funcionará de forma assíncrona quando a virtualização da coluna estiver habilitada, mas as larguras das colunas ainda não foram determinadas. Se as colunas forem removidas antes do trabalho assíncrono ocorrer, poderá ocorrer uma System.ArgumentOutOfRangeException.

Sugestão

Qualquer um dos seguintes:

  • Atualize para o .NET Framework 4.7.
  • Instale o patch de manutenção mais recente para o .NET Framework 4.6.2.
  • Evite remover colunas até que a resposta assíncrona a ScrollIntoView(Object) seja concluída.
Nome Valor
Scope Edge
Versão 4.6.2
Tipo Tempo de execução

APIs afetadas

ObjectDisposedException lançado pelo verificador ortográfico do WPF

Detalhes

Os aplicativos WPF ocasionalmente falham durante o encerramento do aplicativo com um System.ObjectDisposedException gerado pelo verificador ortográfico. Isso é corrigido no WPF do .NET Framework 4.7 manipulando a exceção normalmente e, portanto, garantindo que os aplicativos não sejam mais afetados negativamente. Deve-se observar que exceções ocasionais de primeira chance continuariam a ser observadas em aplicativos executados em um depurador.

Sugestão

Atualizar para o .NET Framework 4.7

Nome Valor
Scope Edge
Versão 4.6.1
Tipo Tempo de execução

APIs afetadas

Não detectável por meio da análise de API.

Redimensionar uma Grade pode fazer com que o aplicativo não responda

Detalhes

Um loop infinito pode ocorrer durante o layout de um T:System.Windows.Controls.Grid sob as seguintes circunstâncias:

  • As definições de linha contêm duas linhas com *, ambas declarando um MinHeight e um MaxHeight.
  • O conteúdo das *-linhas não excede o MaxHeight correspondente.
  • A altura disponível do Grid é excedida pelo primeiro valor de MinHeight (mais quaisquer outras linhas fixas ou do tipo Auto).
  • O aplicativo tem como destino o .NET Framework 4.7 ou aceita o algoritmo de alocação 4.7 definindo Switch.System.Windows.Controls.Grid.StarDefinitionsCanExceedAvailableSpace=false.

O loop também ocorreria com mais de duas linhas ou no caso análogo para colunas. O problema foi corrigido no .NET Framework 4.7.1.

Sugestão

Atualize para o .NET Framework 4.7.1. Como alternativa, se você não precisar do algoritmo de alocação 4.7, poderá usar a seguinte configuração:

<runtime>
  <AppContextSwitchOverrides value="Switch.System.Windows.Controls.Grid.StarDefinitionsCanExceedAvailableSpace=true" />
</runtime>
Nome Valor
Scope Edge
Versão 4.7
Tipo Tempo de execução

APIs afetadas

Não detectável por meio da análise de API.

O plano de fundo do RibbonGroup é definido como transparente em compilações localizadas

Detalhes

System.Windows.Controls.Ribbon.RibbonGroup o fundo em compilações localizadas sempre foi pintado com um pincel transparente, resultando em uma experiência ruim de interface do usuário. Isso é corrigido na correção do WPF do .NET Framework 4.7, atualizando os recursos localizados para System.Windows.Controls.Ribbon.RibbonGroup, o que, por sua vez, garante que o pincel correto seja selecionado.

Sugestão

Atualizar para o .NET Framework 4.7

Nome Valor
Scope Edge
Versão 4.6.2
Tipo Tempo de execução

APIs afetadas

Não detectável por meio da análise de API.

Atualização da Pilha de Impressão do WPF

Detalhes

As APIs de Impressão do WPF usando System.Printing.PrintQueue agora chamam a Print Document Package API do Window, em vez da API de Impressão XPS, agora obsoleta. A alteração foi feita com a capacidade de serviço em mente; nem os usuários nem os desenvolvedores devem ver alterações no comportamento ou no uso da API. A nova pilha de impressão é habilitada por padrão quando executada no Windows 10 Creators Update. A pilha de impressão antiga continuará funcionando como antes em versões mais antigas do Windows.

Sugestão

Para usar a pilha antiga no Windows 10 Creators Update, defina o valor REG_DWORD UseXpsOMPrinting da chave de Registro HKEY_CURRENT_USER\Software\Microsoft\.NETFramework\Windows Presentation Foundation\Printing como 1.

Nome Valor
Scope Edge
Versão 4.7
Tipo Tempo de execução

APIs afetadas

Não detectável por meio da análise de API.

Windows Workflow Foundation (WF)

O fluxo de trabalho agora gera exceção original em vez de NullReferenceException em alguns casos

Detalhes

No .NET Framework 4.6.2 e versões anteriores, quando o método Execute de uma atividade de fluxo de trabalho gera uma exceção com um null valor para a Message propriedade, o runtime do Fluxo de Trabalho do System.Activities gera uma System.NullReferenceException, mascarando a exceção original. No .NET Framework 4.7, a exceção mascarada anteriormente é gerada.

Sugestão

Se o seu código depender do tratamento das exceções System.NullReferenceException, altere-o para capturar as exceções que podem ser geradas pelas suas atividades personalizadas.

Nome Valor
Scope Menor
Versão 4.7
Tipo Tempo de execução

APIs afetadas

A persistência do SQL de fluxo de trabalho adiciona clusters de chave primária e não permite valores nulos em algumas colunas

Detalhes

A partir do .NET Framework 4.7, as tabelas criadas para o SWIS (Repositório de Instâncias de Fluxo de Trabalho do SQL) pelo script SqlWorkflowInstanceStoreSchema.sql usam chaves primárias clusterizadas. Por causa disso, as identidades não dão suporte a valores null. A operação do SWIS não é afetada por essa alteração. As atualizações foram feitas para dar suporte à Replicação Transacional do SQL Server.

Sugestão

O arquivo SQL SqlWorkflowInstanceStoreSchemaUpgrade.sql deve ser aplicado a instalações existentes para experimentar essa alteração. Novas instalações de banco de dados terão a alteração automaticamente.

Nome Valor
Scope Edge
Versão 4.7
Tipo Tempo de execução

APIs afetadas

Não detectável por meio da análise de API.

.NET Framework 4.7.1

JIT

Geração de código incorreta ao passar e comparar valores UInt16

Detalhes

Devido às alterações introduzidas no .NET Framework 4.7, em alguns casos, o código gerado pelo compilador JIT em aplicativos em execução no .NET Framework 4.7 compara incorretamente dois T:System.UInt16 valores. Para obter mais informações, consulte o Problema nº 11508: geração de código incorreta e silenciosa ao passar e comparar argumentos ushort em GitHub.com.

Sugestão

Se você encontrar problemas na comparação de valores sem sinal de 16 bits no .NET Framework 4.7, atualize para o .NET Framework 4.7.1.

Nome Valor
Scope Edge
Versão 4.7
Tipo Tempo de execução

APIs afetadas

Não detectável por meio da análise de API.

Segurança

RSACng e DSACng são mais uma vez utilizáveis em cenários de Confiança Parcial

Detalhes

CngLightup (usado em várias APIs de criptografia de nível superior, como System.Security.Cryptography.Xml.EncryptedXml) e System.Security.Cryptography.RSACng em alguns casos dependem da confiança total. Elas incluem P/Invokes sem declarar SecurityPermissionFlag.UnmanagedCode permissões e caminhos de código em que System.Security.Cryptography.CngKey há demandas de permissão para SecurityPermissionFlag.UnmanagedCode. A partir do .NET Framework 4.6.2, o CngLightup foi usado para alternar para System.Security.Cryptography.RSACng sempre que possível. Como resultado, os aplicativos de confiança parcial que inicialmente usavam System.Security.Cryptography.Xml.EncryptedXml com sucesso começaram a falhar e a gerar exceção SecurityException. Essa alteração adiciona as declarações necessárias para que todas as funções que utilizam o CngLightup tenham as permissões exigidas.

Sugestão

Se essa alteração no .NET Framework 4.6.2 tiver afetado negativamente seus aplicativos de confiança parcial, atualize para o .NET Framework 4.7.1.

Nome Valor
Scope Edge
Versão 4.6.2
Tipo Tempo de execução

APIs afetadas

Windows Communication Foundation (WCF)

O AddressHeaderCollection do WCF agora gera um ArgumentException se um elemento "addressHeader" for nulo.

Detalhes

A partir do .NET Framework 4.7.1, o AddressHeaderCollection(IEnumerable<AddressHeader>) construtor lança um ArgumentException se um dos elementos for null. No .NET Framework 4.7 e versões anteriores, nenhuma exceção é gerada.

Sugestão

Se você encontrar problemas de compatibilidade com essa alteração no .NET Framework 4.7.1 ou em uma versão posterior, poderá recusar a alteração adicionando a seguinte linha à <runtime> seção do arquivo app.config:

<configuration>
  <runtime>
    <AppContextSwitchOverrides value="Switch.System.ServiceModel.DisableAddressHeaderCollectionValidation=true" />
  </runtime>
</configuration>
Nome Valor
Scope Menor
Versão 4.7.1
Tipo Tempo de execução

APIs afetadas

O valor padrão do MsmqSecureHashAlgorithm do WCF agora é SHA256

Detalhes

A partir do .NET Framework 4.7.1, o algoritmo de assinatura de mensagem padrão no WCF para mensagens msmq é SHA256. No .NET Framework 4.7 e versões anteriores, o algoritmo de assinatura de mensagem padrão é SHA1.

Sugestão

Se você encontrar problemas de compatibilidade com essa alteração no .NET Framework 4.7.1 ou posterior, poderá recusar a alteração adicionando a seguinte linha à <runtime> seção do arquivo app.config:

<configuration>
  <runtime>
    <AppContextSwitchOverrides value="Switch.System.ServiceModel.UseSha1InMsmqEncryptionAlgorithm=true" />
  </runtime>
</configuration>
Nome Valor
Scope Menor
Versão 4.7.1
Tipo Tempo de execução

APIs afetadas

Não detectável por meio da análise de API.

WCF PipeConnection.GetHashAlgorithm agora usa SHA256

Detalhes

A partir do .NET Framework 4.7.1, o Windows Communication Foundation usa um hash SHA256 para gerar nomes aleatórios para pipes nomeados. No .NET Framework 4.7 e versões anteriores, ele usava um hash SHA1.

Sugestão

Se você encontrar um problema de compatibilidade com essa alteração no .NET Framework 4.7.1 ou posterior, poderá desativá-lo adicionando a seguinte linha à seção <runtime> do arquivo app.config:

<configuration>
  <runtime>
    <AppContextSwitchOverrides value="Switch.System.ServiceModel.UseSha1InPipeConnectionGetHashAlgorithm=true" />
  </runtime>
</configuration>
Nome Valor
Scope Menor
Versão 4.7.1
Tipo Tempo de execução

APIs afetadas

Não detectável por meio da análise de API.

Windows Presentation Foundation (WPF)

Pop-ups encadeados com StaysOpen=False

Detalhes

Um pop-up com StaysOpen=False deve ser fechado quando você clica fora do pop-up. Quando dois ou mais pop-ups desse tipo são encadeados (ou seja, um contém outro), houve muitos problemas, incluindo:

  • Abra dois níveis, clique fora de P2, mas dentro de P1. Nada acontece.
  • Abra dois níveis, clique fora de P1. Ambos os pop-ups se fecham.
  • Abra e feche dois níveis. Em seguida, tente abrir P2 novamente. Nada acontece.
  • Tente abrir três níveis. Isso não é possível. (Nada acontece ou os dois primeiros níveis fecham, dependendo de onde você clica.)

Esses casos (e outras variantes) agora funcionam conforme o esperado.

Nome Valor
Scope Edge
Versão 4.7.1
Tipo Tempo de execução

APIs afetadas

Falha no Seletor ao remover um item de uma coleção INCC personalizada

Detalhes

Um T:System.InvalidOperationException pode ocorrer no seguinte cenário:

  • O ItemsSource para um T:System.Windows.Controls.Primitives.Selector é uma coleção com uma implementação personalizada de T:System.Collections.Specialized.INotifyCollectionChanged.
  • O item selecionado é removido da coleção.
  • O T:System.Collections.Specialized.NotifyCollectionChangedEventArgs tem P:System.Collections.Specialized.NotifyCollectionChangedEventArgs.OldStartingIndex = -1 (indicando uma posição desconhecida).

A pilha de chamadas da exceção começa at System.Windows.Threading.Dispatcher.VerifyAccess() at System.Windows.DependencyObject.GetValue(DependencyProperty dp) at System.Windows.Controls.Primitives.Selector.GetIsSelected(DependencyObject element). Essa exceção poderá ocorrer no .NET Framework 4.5 se o aplicativo tiver mais de um thread do Dispatcher. No .NET Framework 4.7, a exceção também pode ocorrer em aplicativos com um único thread do Dispatcher.

O problema foi corrigido no .NET Framework 4.7.1.

Sugestão

Atualize para o .NET Framework 4.7.1.

Nome Valor
Scope Menor
Versão 4.7
Tipo Tempo de execução

APIs afetadas

Não detectável por meio da análise de API.

Redimensionar uma Grade pode fazer com que o aplicativo não responda

Detalhes

Um loop infinito pode ocorrer durante o layout de um T:System.Windows.Controls.Grid sob as seguintes circunstâncias:

  • As definições de linha contêm duas linhas com *, ambas declarando um MinHeight e um MaxHeight.
  • O conteúdo das *-linhas não excede o MaxHeight correspondente.
  • A altura disponível do Grid é excedida pelo primeiro valor de MinHeight (mais quaisquer outras linhas fixas ou do tipo Auto).
  • O aplicativo tem como destino o .NET Framework 4.7 ou aceita o algoritmo de alocação 4.7 definindo Switch.System.Windows.Controls.Grid.StarDefinitionsCanExceedAvailableSpace=false.

O loop também ocorreria com mais de duas linhas ou no caso análogo para colunas. O problema foi corrigido no .NET Framework 4.7.1.

Sugestão

Atualize para o .NET Framework 4.7.1. Como alternativa, se você não precisar do algoritmo de alocação 4.7, poderá usar a seguinte configuração:

<runtime>
  <AppContextSwitchOverrides value="Switch.System.Windows.Controls.Grid.StarDefinitionsCanExceedAvailableSpace=true" />
</runtime>
Nome Valor
Scope Edge
Versão 4.7
Tipo Tempo de execução

APIs afetadas

Não detectável por meio da análise de API.

.NET Framework 4.7.2

Núcleo

Permitir Unicode em URIs semelhantes a compartilhamentos UNC

Detalhes

Na System.Uri, a construção de um URI de arquivo contendo tanto um nome de compartilhamento UNC quanto caracteres Unicode não resultará mais em um URI com estado interno inválido. O comportamento será alterado somente quando todos os seguintes forem verdadeiros:

  • O URI tem o esquema file: e é seguido por quatro ou mais barras.
  • O nome do host começa com um sublinhado ou outro símbolo não reservado.
  • O URI contém caracteres Unicode.

Sugestão

Aplicativos que trabalham com URIs que contêm o Unicode de forma consistente podem ter usado esse comportamento para não permitir referências a compartilhamentos UNC. Esses aplicativos devem usar IsUnc em vez disso.

Nome Valor
Scope Edge
Versão 4.7.2
Tipo Tempo de execução

APIs afetadas

Suporte à notação de URI relativo especial quando Unicode estiver presente

Detalhes

Uri não gerará mais um NullReferenceException ao chamar TryCreate em certas URIs relativas que contêm Unicode. A reprodução mais simples da NullReferenceException é abaixo, com as duas instruções sendo equivalentes:

bool success = Uri.TryCreate("http:%C3%A8", UriKind.RelativeOrAbsolute, out Uri href);
bool success = Uri.TryCreate("http:è", UriKind.RelativeOrAbsolute, out Uri href);

Para reproduzir o NullReferenceException, os seguintes itens devem ser verdadeiros:

  • O URI deve ser especificado como relativo, acrescentando-o com 'http:' e não seguindo-o com '//'.
  • O URI deve conter Unicode codificado em percentagem ou símbolos não reservados.

Sugestão

Os usuários que dependem desse comportamento para não permitir URIs relativas devem, em vez disso, especificar UriKind.Absolute ao criar um URI.

Nome Valor
Scope Edge
Versão 4.7.2
Tipo Tempo de execução

APIs afetadas

Tempo de execução

Validação aprimorada de certificado de confiança da cadeia WCF para autenticação de certificado Net.Tcp

Detalhes

O .NET Framework 4.7.2 melhora a validação do certificado de confiança da cadeia ao usar a autenticação de certificado com segurança de transporte com o WCF. Com essa melhoria, os certificados de cliente usados para autenticar em um servidor devem ser configurados para autenticação do cliente. Da mesma forma, os certificados de servidor que são para a autenticação de um servidor devem ser configurados para autenticação de servidor. Com essa alteração, se o certificado raiz estiver desabilitado, a validação da cadeia de certificados falhará. A mesma alteração também foi feita para o .NET Framework 3.5 e versões posteriores por meio do roll-up de segurança do Windows. Você pode encontrar mais informações no KB 4055269. Essa alteração está ativada por padrão e pode ser desativada por uma configuração.

Sugestão

  • Valide se a certificação do servidor e do cliente tem a OID de EKU necessária. Caso contrário, atualize sua certificação.

  • Valide se o certificado raiz é inválido. Nesse caso, atualize o certificado raiz.

  • Se você não puder atualizar o certificado, você pode contornar a mudança drástica temporariamente com a seguinte configuração. No entanto, recusar a alteração deixará seu sistema vulnerável ao problema de segurança.

    <appSettings>
      <add key="wcf:useLegacyCertificateUsagePolicy" value="true" />
    </appSettings>
    
Nome Valor
Scope Menor
Versão 4.7.2
Tipo Tempo de execução

APIs afetadas

Não detectável por meio da análise de API.

Aplicativos Web

A configuração do aplicativo "dataAnnotations:dataTypeAttribute:disableRegEx" está ativada por padrão no .NET Framework 4.7.2

Detalhes

No .NET Framework 4.6.1, foi introduzida uma configuração de aplicativo (dataAnnotations:dataTypeAttribute:disableRegEx) que permite aos usuários desabilitar o uso de expressões regulares em atributos de tipo de dados (como System.ComponentModel.DataAnnotations.EmailAddressAttribute, System.ComponentModel.DataAnnotations.UrlAttributee System.ComponentModel.DataAnnotations.PhoneAttribute). Isso ajuda a reduzir a vulnerabilidade de segurança, como evitar a possibilidade de um ataque de negação de serviço usando expressões regulares específicas.
No .NET Framework 4.6.1, essa configuração de aplicativo para desabilitar o uso do RegEx foi definida false como por padrão. A partir do .NET Framework 4.7.2, essa opção de configuração é definida true por padrão para reduzir ainda mais a vulnerabilidade segura para aplicativos Web destinados ao .NET Framework 4.7.2 e superior.

Sugestão

Se você descobrir que as expressões regulares em seu aplicativo Web não funcionam após a atualização para o .NET Framework 4.7.2, você poderá atualizar o valor da configuração dataAnnotations:dataTypeAttribute:disableRegEx para false para reverter ao comportamento anterior.

<configuration>
<appSettings>
...
<add key="dataAnnotations:dataTypeAttribute:disableRegEx" value="false"/>
...
</appSettings>
</configuration>
Nome Valor
Scope Menor
Versão 4.7.2
Tipo Tempo de execução

APIs afetadas

Não detectável por meio da análise de API.

Windows Presentation Foundation (WPF)

Comportamento de dicas de chave aprimorado no WPF

Detalhes

O comportamento das Dicas de Teclas foi modificado para alinhar-se ao comportamento no Microsoft Word e no Windows Explorer. Ao verificar se o estado da dica de chave está habilitado ou não no caso de um SystemKey ser pressionado (em particular, Key ou F11), o WPF manipula as teclas de dica de tecla adequadamente. As dicas de chave agora descartam um menu mesmo quando ele é aberto pelo mouse.

Sugestão

Não aplicável

Nome Valor
Scope Edge
Versão 4.7.2
Tipo Tempo de execução

APIs afetadas

Não detectável por meio da análise de API.