Cambios de runtime para la migración a .NET Framework 4.7.x

En este artículo se enumeran los problemas de compatibilidad de aplicaciones que se introdujeron en .NET Framework 4.7, 4.7.1 y 4.7.2.

.NET Framework 4.7

JIT

Generación de código incorrecto al pasar y comparar valores UInt16

Detalles

Debido a los cambios introducidos en .NET Framework 4.7, en algunos casos el código generado por el compilador JIT en las aplicaciones que se ejecutan en .NET Framework 4.7 compara dos valores T:System.UInt16 de manera incorrecta. Para obtener más información, vea Issue #11508: Silent bad codegen when passing and comparing ushort args (Problema 11508: generación de código incorrecta en modo silencioso al pasar y comparar argumentos ushort) en GitHub.com.

Sugerencia

Si se producen problemas en la comparación de valores de 16 bits sin signo en .NET Framework 4.7, actualice a .NET Framework 4.7.1.

Nombre Valor
Ámbito Borde
Versión 4.7
Tipo Tiempo de ejecución

API afectadas

No detectable a través del análisis de la API.

Windows Presentation Foundation (WPF)

Al quitar un elemento de una colección personalizada de INCC se produce un bloqueo en Selector

Detalles

Se puede iniciar una excepción T:System.InvalidOperationException en el escenario siguiente:

  • El ItemsSource de un control T:System.Windows.Controls.Primitives.Selector es una colección con una implementación personalizada de T:System.Collections.Specialized.INotifyCollectionChanged.
  • El elemento seleccionado se quita de la colección.
  • T:System.Collections.Specialized.NotifyCollectionChangedEventArgs tiene P:System.Collections.Specialized.NotifyCollectionChangedEventArgs.OldStartingIndex = -1 (lo que indica una posición desconocida).

La pila de llamadas de la excepción comienza at System.Windows.Threading.Dispatcher.VerifyAccess() at System.Windows.DependencyObject.GetValue(DependencyProperty dp) at System.Windows.Controls.Primitives.Selector.GetIsSelected(DependencyObject element). Esta excepción puede producirse en .NET Framework 4.5 si la aplicación tiene más de un subproceso de distribuidor. En .NET Framework 4.7, la excepción también se puede iniciar en las aplicaciones con un único subproceso de distribuidor.

El problema se corrigió en .NET Framework 4.7.1.

Sugerencia

Actualice a .NET Framework 4.7.1.

Nombre Valor
Ámbito Secundaria
Versión 4.7
Tipo Tiempo de ejecución

API afectadas

No detectable a través del análisis de la API.

DataGridCellsPanel.BringIndexIntoView inicia una excepción ArgumentOutOfRangeException

Detalles

ScrollIntoView(Object) funcionará de forma asíncrona cuando se habilite la virtualización de columnas pero el ancho de las columnas todavía no se haya determinado. Si se quitan las columnas antes de que se complete la operación asíncrona, se puede iniciar una excepción System.ArgumentOutOfRangeException.

Sugerencia

Siga uno de estos pasos:

  • Actualice a .NET Framework 4.7.
  • Instale la revisión de reparación más reciente para .NET Framework 4.6.2.
  • Evite quitar las columnas hasta que se haya completado la respuesta asíncrona para ScrollIntoView(Object).
Nombre Valor
Ámbito Borde
Versión 4.6.2
Tipo Tiempo de ejecución

API afectadas

El corrector ortográfico de WPF inicia la excepción ObjectDisposedException

Detalles

En ocasiones, las aplicaciones de WPF se bloquean durante el cierre de la aplicación y el corrector ortográfico inicia una excepción System.ObjectDisposedException. Esto se ha corregido en WPF de .NET Framework 4.7 mediante el control correcto de la excepción, lo que garantiza que las aplicaciones ya no se ven afectadas de manera negativa. Debe tenerse en cuenta que se pueden seguir observando primeras excepciones ocasionales en las aplicaciones que se ejecutan con un depurador.

Sugerencia

Actualizar a .NET Framework 4.7

NOMBRE Valor
Ámbito Borde
Versión 4.6.1
Tipo Tiempo de ejecución

API afectadas

No detectable a través del análisis de la API.

El cambio de tamaño de una cuadrícula puede hacer que una aplicación deje de responder

Detalles

Se puede producir un bucle infinito durante el diseño de un control T:System.Windows.Controls.Grid en las siguientes circunstancias:

  • Las definiciones de fila contienen dos filas *, que declaran un valor MinHeight y un valor MaxHeight.
  • El contenido de las *-filas no supera el valor MaxHeight correspondiente.
  • El alto disponible de la cuadrícula se supera con el primer valor MinHeight (más cualquier otra fila fija o automática).
  • La aplicación tiene como destino .NET Framework 4.7 o admite el algoritmo de asignación de la versión 4.7 estableciendo Switch.System.Windows.Controls.Grid.StarDefinitionsCanExceedAvailableSpace=false.

El bucle también se podría producir con más de dos filas o en el mismo caso para las columnas. El problema se corrigió en .NET Framework 4.7.1.

Sugerencia

Actualice a .NET Framework 4.7.1. Como alternativa, si ya no necesita el algoritmo de asignación de la versión 4.7, puede usar la opción de configuración siguiente:

<runtime>
  <AppContextSwitchOverrides value="Switch.System.Windows.Controls.Grid.StarDefinitionsCanExceedAvailableSpace=true" />
</runtime>
Nombre Valor
Ámbito Borde
Versión 4.7
Tipo Tiempo de ejecución

API afectadas

No detectable a través del análisis de la API.

El fondo de RibbonGroup se establece en transparente en las compilaciones localizadas

Detalles

El fondo de System.Windows.Controls.Ribbon.RibbonGroup en las compilaciones localizadas siempre se pinta con el pincel transparente, lo que produce una experiencia de interfaz de usuario deficiente. Esto se corrigió en WPF en .NET Framework 4.7 mediante la actualización de los recursos localizados para System.Windows.Controls.Ribbon.RibbonGroup lo que, a su vez, garantiza que se seleccione el pincel correcto.

Sugerencia

Actualizar a .NET Framework 4.7

NOMBRE Valor
Ámbito Borde
Versión 4.6.2
Tipo Tiempo de ejecución

API afectadas

No detectable a través del análisis de la API.

Actualización de la pila de impresión de WPF

Detalles

Las API de impresión de WPF en las que se usa System.Printing.PrintQueue ahora llaman a la API Print Document Package de Windows en lugar de la API XPS Print, que está en desuso. El cambio se realizó con la facilidad en mente; ni los usuarios ni los desarrolladores deberían percibir cambios en el comportamiento o el uso de la API. La nueva pila de impresión está habilitada de forma predeterminada cuando se ejecuta en Windows 10 Creators Update. La pila de impresión antigua seguirá funcionando como antes en las versiones anteriores de Windows.

Sugerencia

Para usar la pila antigua en Windows 10 Creators Update, establezca el valor UseXpsOMPrinting REG_DWORD de la clave del Registro HKEY_CURRENT_USER\Software\Microsoft\.NETFramework\Windows Presentation Foundation\Printing en 1.

Nombre Valor
Ámbito Borde
Versión 4.7
Tipo Tiempo de ejecución

API afectadas

No detectable a través del análisis de la API.

Windows Workflow Foundation (WF)

El flujo de trabajo ahora inicia la excepción original en lugar de NullReferenceException en algunos casos

Detalles

En .NET Framework 4.6.2 y versiones anteriores, cuando el método Execute de una actividad de flujo de trabajo inicia una excepción con un valor null para la propiedad Message, el tiempo de ejecución de flujo de trabajo de System.Activities inicia una excepción System.NullReferenceException, ocultando la original. En .NET Framework 4.7, se inicia la excepción enmascarada anteriormente.

Sugerencia

Si el código se basa en el control de la excepción System.NullReferenceException, cámbielo para que detecte las excepciones que puedan iniciarse desde las actividades personalizadas.

Nombre Valor
Ámbito Secundaria
Versión 4.7
Tipo Tiempo de ejecución

API afectadas

La persistencia SQL de flujo de trabajo agrega clústeres de clave principal y no permite valores NULL en algunas columnas

Detalles

A partir de .NET Framework 4.7, en las tablas creadas para el almacén de instancias de flujo de trabajo de SQL (SWIS) por el script SqlWorkflowInstanceStoreSchema.sql se usan claves principales en clúster. Por este motivo, las identidades no admiten valores null. El funcionamiento de SWIS no se ve afectado por este cambio. Las actualizaciones se realizaron para admitir la replicación transaccional de SQL Server.

Sugerencia

El archivo SQL SqlWorkflowInstanceStoreSchemaUpgrade.sql se debe aplicar a las instalaciones existentes con el fin de experimentar este cambio. Las nuevas instalaciones de base de datos tendrán automáticamente el cambio.

Nombre Valor
Ámbito Borde
Versión 4.7
Tipo Tiempo de ejecución

API afectadas

No detectable a través del análisis de la API.

.NET Framework 4.7.1

JIT

Generación de código incorrecto al pasar y comparar valores UInt16

Detalles

Debido a los cambios introducidos en .NET Framework 4.7, en algunos casos el código generado por el compilador JIT en las aplicaciones que se ejecutan en .NET Framework 4.7 compara dos valores T:System.UInt16 de manera incorrecta. Para obtener más información, vea Issue #11508: Silent bad codegen when passing and comparing ushort args (Problema 11508: generación de código incorrecta en modo silencioso al pasar y comparar argumentos ushort) en GitHub.com.

Sugerencia

Si se producen problemas en la comparación de valores de 16 bits sin signo en .NET Framework 4.7, actualice a .NET Framework 4.7.1.

Nombre Valor
Ámbito Borde
Versión 4.7
Tipo Tiempo de ejecución

API afectadas

No detectable a través del análisis de la API.

Seguridad

Se puede volver a usar RSACng y DSACng en escenarios de confianza parcial

Detalles

En algunos casos, CngLightup (que se usa en varias API de criptografía de nivel superior, como System.Security.Cryptography.Xml.EncryptedXml) y System.Security.Cryptography.RSACng se basan en la plena confianza. Estos casos incluyen P/Invoke sin permisos SecurityPermissionFlag.UnmanagedCode de aserción y rutas de código en las que System.Security.Cryptography.CngKey tiene peticiones de permiso para SecurityPermissionFlag.UnmanagedCode. A partir de .NET Framework 4.6.2, CngLightup se usaba para cambiar a System.Security.Cryptography.RSACng siempre que era posible. Como resultado, las aplicaciones de confianza parcial que usaban System.Security.Cryptography.Xml.EncryptedXml correctamente comenzaron a producir errores e iniciar SecurityException excepciones. Este cambio agrega las aserciones necesarias para que todas las funciones en las que se usa CngLightup tengan los permisos necesarios.

Sugerencia

Si este cambio en .NET Framework 4.6.2 ha afectado negativamente a las aplicaciones de confianza parcial, actualice a .NET Framework 4.7.1.

Nombre Valor
Ámbito Borde
Versión 4.6.2
Tipo Tiempo de ejecución

API afectadas

Windows Communication Foundation (WCF)

WCF AddressHeaderCollection ahora inicia una excepción ArgumentException si un elemento addressHeader es NULL

Detalles

A partir de .NET Framework 4.7.1, el constructor AddressHeaderCollection(IEnumerable<AddressHeader>) inicia una excepción ArgumentException si uno de los elementos es null. En .NET Framework 4.7 y versiones anteriores no se inicia ninguna excepción.

Sugerencia

Si encuentra problemas de compatibilidad con este cambio en .NET Framework 4.7.1 o una versión posterior, puede excluirlo mediante la adición de la línea siguiente a la sección <runtime> del archivo app.config:

<configuration>
  <runtime>
    <AppContextSwitchOverrides value="Switch.System.ServiceModel.DisableAddressHeaderCollectionValidation=true" />
  </runtime>
</configuration>
Nombre Valor
Ámbito Secundaria
Versión 4.7.1
Tipo Tiempo de ejecución

API afectadas

El valor predeterminado de MsmqSecureHashAlgorithm de WCF ahora es SHA256

Detalles

A partir de .NET Framework 4.7.1, el algoritmo de firma de mensajes predeterminado de WCF para los mensajes de Msmq es SHA256. En .NET Framework 4.7 y versiones anteriores, el algoritmo de firma de mensajes predeterminado es SHA1.

Sugerencia

Si tiene problemas de compatibilidad con este cambio en .NET Framework 4.7.1 o una versión posterior, puede excluirlo mediante la adición de la línea siguiente a la sección <runtime> del archivo app.config:

<configuration>
  <runtime>
    <AppContextSwitchOverrides value="Switch.System.ServiceModel.UseSha1InMsmqEncryptionAlgorithm=true" />
  </runtime>
</configuration>
NOMBRE Valor
Ámbito Secundaria
Versión 4.7.1
Tipo Tiempo de ejecución

API afectadas

No detectable a través del análisis de la API.

En PipeConnection.GetHashAlgorithm de WCF ahora se usa SHA256

Detalles

A partir de .NET Framework 4.7.1, Windows Communication Foundation usa un código hash SHA256 para generar nombres aleatorios para las canalizaciones con nombre. En .NET Framework 4.7 y versiones anteriores, usaba un hash SHA1.

Sugerencia

Si tiene problemas de compatibilidad con este cambio en .NET Framework 4.7.1 o una versión posterior, puede excluirlo mediante la adición de la línea siguiente a la sección <runtime> del archivo app.config:

<configuration>
  <runtime>
    <AppContextSwitchOverrides value="Switch.System.ServiceModel.UseSha1InPipeConnectionGetHashAlgorithm=true" />
  </runtime>
</configuration>
NOMBRE Valor
Ámbito Secundaria
Versión 4.7.1
Tipo Tiempo de ejecución

API afectadas

No detectable a través del análisis de la API.

Windows Presentation Foundation (WPF)

Menús emergentes encadenados con StaysOpen=False

Detalles

Se supone que un menú emergente con StaysOpen=False se cierra al hacer clic fuera de la ventana emergente. Cuando se encadenaban dos o más de estos elementos Popup (es decir, uno contiene al otro), se producían muchos problemas, incluidos los siguientes:

  • Se abren dos niveles, se hace clic fuera de P2 pero dentro de P1. No sucede nada.
  • Se abren dos niveles, se hace clic fuera de P1. Los dos menús emergentes se cierran.
  • Se abren y se cierran dos niveles. Después, se intenta volver a abrir P2. No sucede nada.
  • Se intenta abrir tres niveles. No se puede. (No sucede nada o se cierra el primero de los dos niveles, en función de dónde se hizo clic).

Estos casos (y otras variantes) ahora funcionan según lo esperado.

Nombre Valor
Ámbito Borde
Versión 4.7.1
Tipo Tiempo de ejecución

API afectadas

Al quitar un elemento de una colección personalizada de INCC se produce un bloqueo en Selector

Detalles

Se puede iniciar una excepción T:System.InvalidOperationException en el escenario siguiente:

  • El ItemsSource de un control T:System.Windows.Controls.Primitives.Selector es una colección con una implementación personalizada de T:System.Collections.Specialized.INotifyCollectionChanged.
  • El elemento seleccionado se quita de la colección.
  • T:System.Collections.Specialized.NotifyCollectionChangedEventArgs tiene P:System.Collections.Specialized.NotifyCollectionChangedEventArgs.OldStartingIndex = -1 (lo que indica una posición desconocida).

La pila de llamadas de la excepción comienza at System.Windows.Threading.Dispatcher.VerifyAccess() at System.Windows.DependencyObject.GetValue(DependencyProperty dp) at System.Windows.Controls.Primitives.Selector.GetIsSelected(DependencyObject element). Esta excepción puede producirse en .NET Framework 4.5 si la aplicación tiene más de un subproceso de distribuidor. En .NET Framework 4.7, la excepción también se puede iniciar en las aplicaciones con un único subproceso de distribuidor.

El problema se corrigió en .NET Framework 4.7.1.

Sugerencia

Actualice a .NET Framework 4.7.1.

Nombre Valor
Ámbito Secundaria
Versión 4.7
Tipo Tiempo de ejecución

API afectadas

No detectable a través del análisis de la API.

El cambio de tamaño de una cuadrícula puede hacer que una aplicación deje de responder

Detalles

Se puede producir un bucle infinito durante el diseño de un control T:System.Windows.Controls.Grid en las siguientes circunstancias:

  • Las definiciones de fila contienen dos filas *, que declaran un valor MinHeight y un valor MaxHeight.
  • El contenido de las *-filas no supera el valor MaxHeight correspondiente.
  • El alto disponible de la cuadrícula se supera con el primer valor MinHeight (más cualquier otra fila fija o automática).
  • La aplicación tiene como destino .NET Framework 4.7 o admite el algoritmo de asignación de la versión 4.7 estableciendo Switch.System.Windows.Controls.Grid.StarDefinitionsCanExceedAvailableSpace=false.

El bucle también se podría producir con más de dos filas o en el mismo caso para las columnas. El problema se corrigió en .NET Framework 4.7.1.

Sugerencia

Actualice a .NET Framework 4.7.1. Como alternativa, si ya no necesita el algoritmo de asignación de la versión 4.7, puede usar la opción de configuración siguiente:

<runtime>
  <AppContextSwitchOverrides value="Switch.System.Windows.Controls.Grid.StarDefinitionsCanExceedAvailableSpace=true" />
</runtime>
Nombre Valor
Ámbito Borde
Versión 4.7
Tipo Tiempo de ejecución

API afectadas

No detectable a través del análisis de la API.

.NET Framework 4.7.2

Principal

Permitir Unicode en URI similares a los recursos compartidos UNC

Detalles

En System.Uri, la construcción de un URI que contenga un nombre de recurso compartido UNC y caracteres Unicode ya no dará como resultado un URI con el estado interno no válido. El comportamiento solo cambiará cuando se cumpla todo lo siguiente:

  • El URI tiene el esquema file: y va seguido de cuatro o más barras diagonales.
  • El nombre de host comienza con un carácter de subrayado u otro símbolo no reservado.
  • El URI contiene caracteres Unicode.

Sugerencia

Las aplicaciones que trabajan con URI que contienen Unicode de forma coherente podrían haber usado este comportamiento para no permitir referencias a recursos compartidos UNC. En su lugar, esas aplicaciones deben usar IsUnc.

NOMBRE Valor
Ámbito Borde
Versión 4.7.2
Tipo Tiempo de ejecución

API afectadas

Admitir una notación de URI relativo especial cuando Unicode está presente

Detalles

Uri ya no lanzará una excepción NullReferenceException al llamar a TryCreate en ciertos URI relativos que contienen Unicode. La reproducción más sencilla de NullReferenceException se muestra a continuación, donde las dos instrucciones son equivalentes:

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

Para reproducir la excepción NullReferenceException, se debe cumplir lo siguiente:

  • Debe anteponer "http:" y excluir "//" después para especificar el URI como relativo.
  • El URI debe contener símbolos no reservados o Unicode codificados por porcentaje.

Sugerencia

Los usuarios que dependan de este comportamiento para no permitir los URI relativos deben especificar en su lugar UriKind.Absolute al crear un URI.

NOMBRE Valor
Ámbito Borde
Versión 4.7.2
Tipo Tiempo de ejecución

API afectadas

Tiempo de ejecución

Mejora de la validación de certificados de confianza de cadena de WCF para la autenticación de certificados de Net.Tcp

Detalles

.NET Framework 4.7.2 mejora la validación de certificados de confianza de cadena al usar la autenticación de certificados con seguridad de transporte con WCF. Con esta mejora, los certificados de cliente que se usan para la autenticación en un servidor se deben configurar para la autenticación de cliente. De forma similar, los certificados de servidor que sirven para autenticar un servidor se deben configurar para la autenticación de servidor. Con este cambio, si el certificado raíz está deshabilitado, se produce un error en la validación de la cadena de certificados. El mismo cambio también se realizó en .NET Framework 3.5 y versiones posteriores mediante la acumulación de seguridad de Windows. Puede encontrar más información aquí. Este cambio se activa de forma predeterminada y se puede desactivar con una opción de configuración.

Sugerencia

  • Valide si la certificación de servidor y cliente tiene el OID del EKU necesario. Si no es así, actualice la certificación.

  • Compruebe si el certificado raíz no es válido. Si es así, actualice el certificado raíz.

  • Si no puede actualizar el certificado, puede evitar temporalmente el cambio importante con la opción de configuración a continuación. Sin embargo, no participar en el cambio dejará el sistema vulnerable al problema de seguridad.

    <appSettings>
      <add key="wcf:useLegacyCertificateUsagePolicy" value="true" />
    </appSettings>
    
Nombre Valor
Ámbito Secundaria
Versión 4.7.2
Tipo Tiempo de ejecución

API afectadas

No detectable a través del análisis de la API.

Aplicaciones web

La configuración de aplicación "dataAnnotations:dataTypeAttribute:disableRegEx" está activada de manera predeterminada en .NET Framework 4.7.2.

Detalles

En .NET Framework 4.6.1, se incluyó una configuración de aplicación (dataAnnotations:dataTypeAttribute:disableRegEx) que permite a los usuarios deshabilitar el uso de expresiones regulares en atributos de tipos de datos (como System.ComponentModel.DataAnnotations.EmailAddressAttribute, System.ComponentModel.DataAnnotations.UrlAttribute y System.ComponentModel.DataAnnotations.PhoneAttribute). Esto ayuda a reducir la vulnerabilidad de la seguridad, ya que se evita la posibilidad de un ataque por denegación de servicio con expresiones regulares específicas.
En .NET Framework 4.6.1, esta configuración de aplicación para deshabilitar el uso de expresiones regulares se estableció en false de manera predeterminada. A partir de .NET Framework 4.7.2, este conmutador de configuración está establecido en true de manera predeterminada para reducir todavía más la vulnerabilidad de seguridad para las aplicaciones web que tengan como objetivo .NET Framework 4.7.2 y versiones superiores.

Sugerencia

Si las expresiones regulares de su aplicación web no funcionan después de actualizar a .NET Framework 4.7.2, puede actualizar el valor de la configuración dataAnnotations:dataTypeAttribute:disableRegEx a false para volver al comportamiento anterior.

<configuration>
<appSettings>
...
<add key="dataAnnotations:dataTypeAttribute:disableRegEx" value="false"/>
...
</appSettings>
</configuration>
NOMBRE Valor
Ámbito Secundaria
Versión 4.7.2
Tipo Tiempo de ejecución

API afectadas

No detectable a través del análisis de la API.

Windows Presentation Foundation (WPF)

Mejora del comportamiento de los KeyTip en WPF

Detalles

El comportamiento de los KeyTip se ha modificado para equipararlo al de Microsoft Word y el Explorador de Windows. Mediante la comprobación de si el estado del KeyTip está habilitado o no cuando se presiona una SystemKey (en concreto, Key o F11), WPF administra las teclas de KeyTip de la forma adecuada. Los KeyTip ahora cierran un menú incluso cuando se abre con el mouse.

Sugerencia

N/D

NOMBRE Valor
Ámbito Borde
Versión 4.7.2
Tipo Tiempo de ejecución

API afectadas

No detectable a través del análisis de la API.