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

Este artigo lista os problemas de compatibilidade de aplicativos que foram introduzidos no .NET Framework 4.7, 4.7.1, e 4.7.2.

.NET Framework 4.7

JIT

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

Detalhes

Em virtude das alterações realizadas 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 é incorretamente comparado com dois valores T:System.UInt16. Para saber mais, consulte, Issue #11508: Silent bad codegen when passing and comparing ushort args (Problema nº11508: Geração de código silenciosa incorreta ao passar e comparar args ushor), no GitHub.com.

Sugestão

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

Nome Valor
Escopo Microsoft Edge
Versão 4.7
Tipo Runtime

APIs afetadas

Não detectáveis com a análise de API.

Windows Presentation Foundation (WPF)

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

Detalhes

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

  • O ItemsSource de 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, o que indica 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 Dispatcher.

O problema foi corrigido no .NET Framework 4.7.1.

Sugestão

Atualizar para o .NET Framework 4.7.1.

Nome Valor
Escopo Secundária
Versão 4.7
Tipo Runtime

APIs afetadas

Não detectáveis com a análise de API.

DataGridCellsPanel.BringIndexIntoView gera ArgumentOutOfRangeException

Detalhes

ScrollIntoView(Object) será executado assincronamente quando a virtualização de coluna estiver habilitada, mas as larguras das colunas ainda não estiverem determinadas. Se as colunas forem removidas antes da operação assíncrona, um System.ArgumentOutOfRangeException poderá ocorrer.

Sugestão

Siga um destes procedimentos:

  • Atualize para o .NET Framework 4.7.
  • Instale o patch de manutenção mais recente para o .NET Framework 4.6.2.
  • Evitar remover colunas até que a resposta assíncrona ao método ScrollIntoView(Object) seja concluída.
Nome Valor
Escopo Microsoft Edge
Versão 4.6.2
Tipo Runtime

APIs afetadas

ObjectDisposedException gerada pelo verificador ortográfico do WPF

Detalhes

Ocasionalmente, os aplicativos WPF falham durante o desligamento com uma System.ObjectDisposedException gerada pelo verificador ortográfico. Isso foi corrigido no WPF do .NET Framework 4.7 por meio do tratamento normal da exceção, garantindo que os aplicativos não sejam mais prejudicados. Observe que exceções de primeira chance ocasionais continuariam a ser observadas em aplicativos em execução em um depurador.

Sugestão

Atualizar para o .NET Framework 4.7

Nome Valor
Escopo Microsoft Edge
Versão 4.6.1
Tipo Runtime

APIs afetadas

Não detectáveis com a análise de API.

Redimensionar uma Grade pode fazer com que o aplicativo pare de responder

Detalhes

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

  • As definições de linha contêm dois *-rows, ambos declarando um MinHeight e um MaxHeight.
  • O conteúdo de *-rows não excede o MaxHeight correspondente.
  • A altura disponível da Grade é excedida pelo primeiro MinHeight (além de qualquer outra linha fixa ou automática).
  • O aplicativo é direcionado ao .NET Framework 4.7 ou opta pelo algoritmo de alocação 4.7 definindo Switch.System.Windows.Controls.Grid.StarDefinitionsCanExceedAvailableSpace=false.

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

Sugestão

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

<runtime>
  <AppContextSwitchOverrides value="Switch.System.Windows.Controls.Grid.StarDefinitionsCanExceedAvailableSpace=true" />
</runtime>
Nome Valor
Escopo Microsoft Edge
Versão 4.7
Tipo Runtime

APIs afetadas

Não detectáveis com a análise de API.

Tela de fundo RibbonGroup é definida como transparente em builds localizados

Detalhes

A tela de fundo System.Windows.Controls.Ribbon.RibbonGroup em builds localizados sempre foi pintada com um pincel Transparente, o que resultava em uma experiência de interface do usuário ruim. Isso foi corrigido no WPF do .NET Framework 4.7 por meio da atualização dos recursos localizados para System.Windows.Controls.Ribbon.RibbonGroup, que, por sua vez, garante que o pincel correto seja selecionado.

Sugestão

Atualizar para o .NET Framework 4.7

Nome Valor
Escopo Microsoft Edge
Versão 4.6.2
Tipo Runtime

APIs afetadas

Não detectáveis com a análise de API.

Atualização da pilha de impressão do WPF

Detalhes

Agora, as APIs de Impressão do WPF que usam System.Printing.PrintQueuechamam a API de Impressão Pacote de Documentos do Windows em vez da API de Impressão XPS, que foi preterida. A alteração foi feita para fins de manutenção. Nem usuários nem os desenvolvedores devem ver todas as alterações no comportamento ou no uso da API. A nova pilha de impressão é habilitada por padrão ao ser executada na Atualização do Windows 10 para Criadores. A pilha de impressão antiga continuará a funcionar como antes nas versões mais antigas do Windows.

Sugestão

Para usar a pilha antiga na Atualização do Windows 10 para Criadores, defina o valor REG_DWORD UseXpsOMPrinting da chave do Registro HKEY_CURRENT_USER\Software\Microsoft\.NETFramework\Windows Presentation Foundation\Printing como 1.

Nome Valor
Escopo Microsoft Edge
Versão 4.7
Tipo Runtime

APIs afetadas

Não detectáveis com a análise de API.

Windows Workflow Foundation (WF)

Agora, o fluxo de trabalho gera a 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 Executar de uma atividade de fluxo de trabalho gera uma exceção com um valor null para a propriedade Message, o runtime do fluxo de trabalho System.Activities gera System.NullReferenceException, mascarando a exceção original. No .NET Framework 4.7, a exceção mascarada anteriormente é gerada.

Sugestão

Se o código depender do tratamento de System.NullReferenceException, altere-o para capturar as exceções que possam ser geradas por meio das atividades personalizadas.

Nome Valor
Escopo Secundária
Versão 4.7
Tipo Runtime

APIs afetadas

Persistência do fluxo de trabalho SQL 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 a SWIS (SQL Workflow Instance Store) pelo script SqlWorkflowInstanceStoreSchema.sql usarão chaves primárias em clusters. Por isso, as identidades não são compatíveis com valores null. A operação da SWIS não é afetada por essa alteração. As atualizações foram feitas serem compatíveis com replicação transacional do SQL Server.

Sugestão

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

Nome Valor
Escopo Microsoft Edge
Versão 4.7
Tipo Runtime

APIs afetadas

Não detectáveis com a análise de API.

.NET Framework 4.7.1

JIT

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

Detalhes

Em virtude das alterações realizadas 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 é incorretamente comparado com dois valores T:System.UInt16. Para saber mais, consulte, Issue #11508: Silent bad codegen when passing and comparing ushort args (Problema nº11508: Geração de código silenciosa incorreta ao passar e comparar args ushor), no GitHub.com.

Sugestão

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

Nome Valor
Escopo Microsoft Edge
Versão 4.7
Tipo Runtime

APIs afetadas

Não detectáveis com a análise de API.

Segurança

RSACng e DSACng podem ser usados novamente em cenários de confiança parcial

Detalhes

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

Sugestão

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

Nome Valor
Escopo Microsoft Edge
Versão 4.6.2
Tipo Runtime

APIs afetadas

Windows Communication Foundation (WCF)

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

Detalhes

A partir do .NET Framework 4.7.1, o construtor AddressHeaderCollection(IEnumerable<AddressHeader>) gera ArgumentException se um elemento 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á recusá-la adicionando a seguinte linha à seção <runtime> do arquivo app.config:

<configuration>
  <runtime>
    <AppContextSwitchOverrides value="Switch.System.ServiceModel.DisableAddressHeaderCollectionValidation=true" />
  </runtime>
</configuration>
Nome Valor
Escopo Secundária
Versão 4.7.1
Tipo Runtime

APIs afetadas

O valor padrão MsmqSecureHashAlgorithm do WCF agora é SHA256

Detalhes

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

Sugestão

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

<configuration>
  <runtime>
    <AppContextSwitchOverrides value="Switch.System.ServiceModel.UseSha1InMsmqEncryptionAlgorithm=true" />
  </runtime>
</configuration>
Nome Valor
Escopo Secundária
Versão 4.7.1
Tipo Runtime

APIs afetadas

Não detectáveis com a análise de API.

PipeConnection.GetHashAlgorithm do WCF agora usa o SHA256

Detalhes

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

Sugestão

Se houver problemas de compatibilidade com essa alteração no .NET Framework 4.7.1 ou uma versão posterior, é possível recusá-la adicionando a seguinte linha à seção <runtime> do arquivo app.config:

<configuration>
  <runtime>
    <AppContextSwitchOverrides value="Switch.System.ServiceModel.UseSha1InPipeConnectionGetHashAlgorithm=true" />
  </runtime>
</configuration>
Nome Valor
Escopo Secundária
Versão 4.7.1
Tipo Runtime

APIs afetadas

Não detectáveis com a análise de API.

Windows Presentation Foundation (WPF)

Pop-ups encadeados com StaysOpen=False

Detalhes

Um pop-up com StaysOpen=False deve fechar quando você clica fora dele. Quando dois ou mais pop-ups do tipo estão encadeados (por exemplo, quando um contém o outro), há muitos problemas, incluindo:

  • Abra dois níveis, clique fora do P2, mas dentro do P1. Nada acontecerá.
  • Abra dois níveis, clique fora do P1. Ambos pop-ups serão fechados.
  • Abra e feche dois níveis. Em seguida, tente abrir novamente o P2. Nada acontecerá.
  • Tente abrir três níveis. Não é possível. Nada acontecerá ou os primeiros dois níveis fecharão, dependendo de onde você clicar.

Agora, esses casos (e outras variantes) funcionam conforme o esperado.

Nome Valor
Escopo Microsoft Edge
Versão 4.7.1
Tipo Runtime

APIs afetadas

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

Detalhes

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

  • O ItemsSource de 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, o que indica 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 Dispatcher.

O problema foi corrigido no .NET Framework 4.7.1.

Sugestão

Atualizar para o .NET Framework 4.7.1.

Nome Valor
Escopo Secundária
Versão 4.7
Tipo Runtime

APIs afetadas

Não detectáveis com a análise de API.

Redimensionar uma Grade pode fazer com que o aplicativo pare de responder

Detalhes

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

  • As definições de linha contêm dois *-rows, ambos declarando um MinHeight e um MaxHeight.
  • O conteúdo de *-rows não excede o MaxHeight correspondente.
  • A altura disponível da Grade é excedida pelo primeiro MinHeight (além de qualquer outra linha fixa ou automática).
  • O aplicativo é direcionado ao .NET Framework 4.7 ou opta pelo algoritmo de alocação 4.7 definindo Switch.System.Windows.Controls.Grid.StarDefinitionsCanExceedAvailableSpace=false.

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

Sugestão

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

<runtime>
  <AppContextSwitchOverrides value="Switch.System.Windows.Controls.Grid.StarDefinitionsCanExceedAvailableSpace=true" />
</runtime>
Nome Valor
Escopo Microsoft Edge
Versão 4.7
Tipo Runtime

APIs afetadas

Não detectáveis com a análise de API.

.NET Framework 4.7.2

Núcleo

Permitir Unicode em URIs semelhantes a compartilhamentos UNC

Detalhes

No System.Uri, a criação de um URI de arquivo contendo um nome do compartilhamento UNC e caracteres Unicode não resultará mais em um URI com estado interno inválido. O comportamento será alterado somente quando todos os itens a seguir forem verdadeiros:

  • O URI tiver o esquema file: e for seguido por quatro ou mais barras.
  • O nome do host começar com um sublinhado ou outro símbolo não reservado.
  • O URI contiver caracteres Unicode.

Sugestão

Os aplicativos que funcionam com URIs que contêm Unicode de forma consistente podem ter aceitado o uso desse comportamento para não permitir referências a compartilhamentos UNC. Esses aplicativos devem usar IsUnc.

Nome Valor
Escopo Microsoft Edge
Versão 4.7.2
Tipo Runtime

APIs afetadas

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

Detalhes

Uri não gerará mais uma NullReferenceException ao chamar TryCreate em determinados URIs relativos que contenham Unicode. A reprodução mais simples da NullReferenceException está 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 a NullReferenceException, os itens a seguir precisam ser verdadeiros:

  • O URI precisa ser especificado como relativo, sendo precedido de 'http:' e não seguido de '//'.
  • O URI precisa conter Unicode codificado por porcentagem ou símbolos não reservados.

Sugestão

Os usuários que dependem desse comportamento para não permitir URIs relativos precisam especificar UriKind.Absolute durante a criação de um URI.

Nome Valor
Escopo Microsoft Edge
Versão 4.7.2
Tipo Runtime

APIs afetadas

Runtime

Melhor validação do certificado de confiança de cadeia do WCF para autenticação de certificado do Net.Tcp

Detalhes

O .NET framework 4.7.2 melhorou a validação do certificado de confiança de cadeia ao usar a autenticação de certificado com a segurança de transporte com o WCF. Com essa melhoria, os certificados do cliente que são usados para autenticar um servidor precisam ser configurados para autenticação do cliente. Da mesma forma, os certificados do servidor usados para autenticar um servidor precisam ser configurados para autenticação do servidor. Com essa alteração, se o certificado raiz for desabilitado, a validação da cadeia de certificados falhará. A mesma alteração também foi feita para o .NET Framework 3.5 e as versões posteriores por meio do pacote cumulativo de segurança do Windows. Encontre mais informações aqui. Essa alteração é habilitada por padrão e pode ser desabilitada por uma definição de configuração.

Sugestão

  • Valide se a certificação do servidor e do cliente têm o OID de EKU necessário. Caso contrário, atualize a certificação.

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

  • Se não for possível atualizar o certificado, você poderá contornar a alteração interruptiva temporariamente com a seguinte definição de configuração. No entanto, recusar a alteração deixará o sistema vulnerável ao problema de segurança.

    <appSettings>
      <add key="wcf:useLegacyCertificateUsagePolicy" value="true" />
    </appSettings>
    
Nome Valor
Escopo Secundária
Versão 4.7.2
Tipo Runtime

APIs afetadas

Não detectáveis com a análise de API.

Aplicativos Web

A configuração de aplicativo "dataAnnotations:dataTypeAttribute:disableRegEx" é habilitada 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 que os usuários desabilitem o uso de expressões regulares em atributos de tipo de dados (como System.ComponentModel.DataAnnotations.EmailAddressAttribute, System.ComponentModel.DataAnnotations.UrlAttribute e System.ComponentModel.DataAnnotations.PhoneAttribute). Isso ajuda a reduzir vulnerabilidades de segurança, por exemplo, impedindo que um ataque de negação de serviço use expressões regulares específicas.
No .NET Framework 4.6.1, essa configuração de aplicativo para desabilitar o uso de expressões regulares era definida como false por padrão. A partir do .NET Framework 4.7.2, essa opção de configuração é definida com true por padrão para reduzir ainda mais a vulnerabilidade segura de aplicativos da Web direcionados ao .NET Framework 4.7.2 e superior.

Sugestão

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

<configuration>
<appSettings>
...
<add key="dataAnnotations:dataTypeAttribute:disableRegEx" value="false"/>
...
</appSettings>
</configuration>
Nome Valor
Escopo Secundária
Versão 4.7.2
Tipo Runtime

APIs afetadas

Não detectáveis com a análise de API.

Windows Presentation Foundation (WPF)

Melhoria no comportamento das dicas de tecla no WPF

Detalhes

O comportamento das dicas de tecla foi modificado para manter a paridade com o comportamento no Microsoft Word e no Windows Explorer. Ao verificar se o estado da dica de tecla está habilitado ou não no caso de uma SystemKey (especificamente, Key ou F11) que está sendo pressionada, o WPF trata corretamente as teclas de dica de tecla. As dicas de tecla agora descartam um menu, mesmo quando ele é aberto pelo mouse.

Sugestão

N/D

Nome Valor
Escopo Microsoft Edge
Versão 4.7.2
Tipo Runtime

APIs afetadas

Não detectáveis com a análise de API.