Cambios en tiempo de ejecución 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 incorrecta 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 incorrectamente dos T:System.UInt16 valores. Para obtener más información, vea Problema 11508: Código incorrecto silencioso al pasar y comparar argumentos de ushort en GitHub.com.

Sugerencia

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

Nombre Importancia
Ámbito Borde
Versión 4,7
Tipo Tiempo de ejecución

Las APIs afectadas

No se puede detectar a través del análisis de API.

Windows Presentation Foundation (WPF)

Fallo en Selector al quitar un elemento de una colección INCC personalizada

Detalles

Un T:System.InvalidOperationException puede ocurrir en el siguiente escenario:

  • La ItemsSource para un 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 (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 dispatcher. En .NET Framework 4.7, la excepción también puede producirse en aplicaciones con un único subproceso de distribuidor.

El problema se ha corregido en .NET Framework 4.7.1.

Sugerencia

Actualice a .NET Framework 4.7.1.

Nombre Importancia
Ámbito menor
Versión 4,7
Tipo Tiempo de ejecución

Las APIs afectadas

No se puede detectar a través del análisis de API.

DataGridCellsPanel.BringIndexIntoView lanza ArgumentOutOfRangeException

Detalles

ScrollIntoView(Object) funcionará de forma asincrónica cuando la virtualización de columnas está habilitada, pero aún no se han determinado los anchos de columna. Si las columnas se eliminan antes de que se produzca el trabajo asincrónico, podría ocurrir un System.ArgumentOutOfRangeException.

Sugerencia

Cualquiera de las siguientes opciones:

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

Las APIs afectadas

ObjectDisposedException producida por el corrector ortográfico de WPF

Detalles

Las aplicaciones WPF se bloquean ocasionalmente durante el cierre de la aplicación con un System.ObjectDisposedException lanzado por el corrector ortográfico. Esto se corrige en .NET Framework 4.7 WPF controlando la excepción correctamente y, por tanto, garantizando que las aplicaciones ya no se vean afectadas negativamente. Se debe tener en cuenta que las excepciones ocasionales de primera oportunidad seguirán siendo observadas en las aplicaciones que se ejecutan en un depurador.

Sugerencia

Actualización a .NET Framework 4.7

Nombre Importancia
Ámbito Borde
Versión 4.6.1
Tipo Tiempo de ejecución

Las APIs afectadas

No se puede detectar a través del análisis de API.

Cambiar el tamaño de una cuadrícula puede hacer que la aplicación deje de responder

Detalles

Un bucle infinito puede producirse durante el diseño de un T:System.Windows.Controls.Grid objeto en las siguientes circunstancias:

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

El bucle también se produciría con más de dos filas o en el caso análogo de las columnas. El problema se ha corregido en .NET Framework 4.7.1.

Sugerencia

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

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

Las APIs afectadas

No se puede detectar a través del análisis de API.

El fondo de "ribbonGroup" se establece en transparente en compilaciones personalizadas.

Detalles

System.Windows.Controls.Ribbon.RibbonGroup El fondo de las compilaciones localizadas siempre se pintó con pincel transparente, lo que da lugar a una experiencia de interfaz de usuario deficiente. Esto se ha corregido en el parche de WPF de .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

Actualización a .NET Framework 4.7

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

Las APIs afectadas

No se puede detectar a través del análisis de API.

Actualización de pila de impresión de WPF

Detalles

Las API de impresión de WPF que usan System.Printing.PrintQueue ahora llaman a la API Print Document Package de Windows en lugar de la API de impresión XPS, que ahora está en desuso. El cambio se realizó teniendo en cuenta la capacidad de servicio; ni los usuarios ni los desarrolladores deben ver ningún cambio en el comportamiento ni en 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 anterior seguirá funcionando igual que antes en versiones anteriores de Windows.

Sugerencia

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

Nombre Importancia
Ámbito Borde
Versión 4,7
Tipo Tiempo de ejecución

Las APIs afectadas

No se puede detectar a través del análisis de API.

Windows Workflow Foundation (WF)

El flujo de trabajo ahora lanza 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 lanza una excepción con un valor de null para la propiedad Message, el entorno de ejecución de flujo de trabajo System.Activities lanza una excepción System.NullReferenceException, enmascarando la excepción original. En .NET Framework 4.7, se lanza la excepción que anteriormente estaba enmascarada.

Sugerencia

Si el código se basa en manejar System.NullReferenceException, modifíquelo para capturar las excepciones que se podrían producir a partir de las actividades personalizadas.

Nombre Importancia
Ámbito menor
Versión 4,7
Tipo Tiempo de ejecución

Las APIs afectadas

La persistencia de SQL en flujo de trabajo agrega claves primarias agrupadas y rechaza valores NULL en algunas columnas.

Detalles

A partir de .NET Framework 4.7, las tablas creadas para el almacén de instancias de flujo de trabajo (SWIS) de SQL mediante el script de SqlWorkflowInstanceStoreSchema.sql usan claves principales en clúster. Por este motivo, las identidades no admiten null valores. 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 debe aplicarse a las instalaciones existentes para experimentar este cambio. Las nuevas instalaciones de base de datos tendrán automáticamente el cambio.

Nombre Importancia
Ámbito Borde
Versión 4,7
Tipo Tiempo de ejecución

Las APIs afectadas

No se puede detectar a través del análisis de API.

.NET Framework 4.7.1

JIT

Generación de código incorrecta 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 incorrectamente dos T:System.UInt16 valores. Para obtener más información, vea Problema 11508: Código incorrecto silencioso al pasar y comparar argumentos de ushort en GitHub.com.

Sugerencia

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

Nombre Importancia
Ámbito Borde
Versión 4,7
Tipo Tiempo de ejecución

Las APIs afectadas

No se puede detectar a través del análisis de API.

Seguridad

RSACng y DSACng se pueden volver a usar en escenarios de confianza parcial

Detalles

CngLightup (que se usa en varias API criptográficas de nivel superior, como System.Security.Cryptography.Xml.EncryptedXml) y System.Security.Cryptography.RSACng , en algunos casos, dependen de plena confianza. Entre ellas se incluyen P/Invokes sin afirmar SecurityPermissionFlag.UnmanagedCode permisos y rutas de código donde System.Security.Cryptography.CngKey tiene demandas de permisos para SecurityPermissionFlag.UnmanagedCode. A partir de .NET Framework 4.6.2, CngLightup se usó para cambiar a System.Security.Cryptography.RSACng siempre que sea posible. Como resultado, las aplicaciones de confianza parcial que utilizaron con éxito System.Security.Cryptography.Xml.EncryptedXml comenzaron a fallar y lanzar excepciones SecurityException. Este cambio agrega las aserciones necesarias para que todas las funciones que utilizan 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 Importancia
Ámbito Borde
Versión 4.6.2
Tipo Tiempo de ejecución

Las APIs afectadas

Windows Communication Foundation (WCF)

WCF AddressHeaderCollection ahora lanza una excepción ArgumentException si un elemento AddressHeader es null.

Detalles

A partir de .NET Framework 4.7.1, el AddressHeaderCollection(IEnumerable<AddressHeader>) constructor produce un ArgumentException si uno de los elementos es null. En .NET Framework 4.7 y versiones anteriores, no se produce 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 agregando la siguiente línea a la <runtime> sección del archivo app.config:

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

Las APIs afectadas

El valor predeterminado MsmqSecureHashAlgorithm de WCF ahora es SHA256

Detalles

A partir de .NET Framework 4.7.1, el algoritmo de firma de mensajes predeterminado en WCF para mensajes 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 posterior, puede excluir el cambio agregando la siguiente línea a la <runtime> sección del archivo app.config:

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

Las APIs afectadas

No se puede detectar a través del análisis de API.

WcF PipeConnection.GetHashAlgorithm usa ahora SHA256

Detalles

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

Sugerencia

Si tiene un problema de compatibilidad con este cambio en el .NET Framework 4.7.1 o posterior, puede desactivarlo agregando la siguiente línea en la sección <runtime> de su archivo app.config:

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

Las APIs afectadas

No se puede detectar a través del análisis de API.

Windows Presentation Foundation (WPF)

Ventanas emergentes encadenadas con StaysOpen=False

Detalles

Un elemento emergente con StaysOpen=False debe cerrarse al hacer clic fuera del elemento emergente. Cuando dos o más ventanas emergentes están encadenadas (es decir, una contiene a otra), hay muchos problemas, entre los que se incluyen:

  • Abra dos niveles, haga clic fuera de P2, pero dentro de P1. No pasa nada.
  • Abra dos niveles, haga clic fuera de P1. Ambas ventanas emergentes se cierran.
  • Abra y cierre dos niveles. A continuación, vuelva a intentar abrir P2. No pasa nada.
  • Intente abrir tres niveles. No puede. (No sucede nada o los dos primeros niveles se cierran, dependiendo de dónde haga clic).

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

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

Las APIs afectadas

Fallo en Selector al quitar un elemento de una colección INCC personalizada

Detalles

Un T:System.InvalidOperationException puede ocurrir en el siguiente escenario:

  • La ItemsSource para un 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 (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 dispatcher. En .NET Framework 4.7, la excepción también puede producirse en aplicaciones con un único subproceso de distribuidor.

El problema se ha corregido en .NET Framework 4.7.1.

Sugerencia

Actualice a .NET Framework 4.7.1.

Nombre Importancia
Ámbito menor
Versión 4,7
Tipo Tiempo de ejecución

Las APIs afectadas

No se puede detectar a través del análisis de API.

Cambiar el tamaño de una cuadrícula puede hacer que la aplicación deje de responder

Detalles

Un bucle infinito puede producirse durante el diseño de un T:System.Windows.Controls.Grid objeto en las siguientes circunstancias:

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

El bucle también se produciría con más de dos filas o en el caso análogo de las columnas. El problema se ha corregido en .NET Framework 4.7.1.

Sugerencia

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

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

Las APIs afectadas

No se puede detectar a través del análisis de API.

.NET Framework 4.7.2

Núcleo

Permitir Unicode en URI similares a recursos compartidos UNC

Detalles

En System.Uri, la construcción de un URI de archivo que contenga un nombre de recurso compartido UNC y caracteres Unicode dejará de dar lugar a un URI con un estado interno no válido. El comportamiento solo cambiará cuando se cumplen todas las siguientes condiciones:

  • 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 impedir referencias a recursos compartidos UNC. Esas aplicaciones deben usarse IsUnc en su lugar.

Nombre Importancia
Ámbito Borde
Versión 4.7.2
Tipo Tiempo de ejecución

Las APIs afectadas

Soportar la notación especial de URI relativa cuando hay Unicode presente

Detalles

Uri ya no producirá un NullReferenceException al llamar a TryCreate en determinados URI relativos que contengan Unicode. La reproducción más sencilla de NullReferenceException es la siguiente, siendo equivalentes las dos instrucciones.

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

Para reproducir el NullReferenceException, los siguientes elementos deben ser verdaderos:

  • La URI debe especificarse como relativa, anteponiéndole "http:" y sin que le siga "//".
  • El URI debe contener caracteres Unicode codificados en porcentaje o no reservados.

Sugerencia

Los usuarios que dependen de este comportamiento para evitar los URIs relativos deben especificar UriKind.Absolute al crear un URI.

Nombre Importancia
Ámbito Borde
Versión 4.7.2
Tipo Tiempo de ejecución

Las APIs afectadas

Tiempo de ejecución

Se ha mejorado la validación de certificados de confianza en cadena en 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 autenticarse en un servidor deben configurarse para la autenticación de cliente. De forma similar, los certificados de servidor que son para la autenticación de un servidor deben configurarse para la autenticación del 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 a través de la actualización acumulativa de seguridad de Windows. Puede encontrar más información en KB 4055269. Este cambio está activado de forma predeterminada y se puede desactivar mediante una configuración.

Sugerencia

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

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

  • Si no puede actualizar el certificado, puede solucionar el cambio importante temporalmente con la siguiente configuración. Sin embargo, la exclusión del cambio dejará al sistema vulnerable al problema de seguridad.

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

Las APIs afectadas

No se puede detectar a través del análisis de API.

Aplicaciones web

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

Detalles

En .NET Framework 4.6.1, se introdujo una configuración de aplicación () que permite a los usuarios deshabilitar el uso de expresiones regulares en atributos de tipo de datos (dataAnnotations:dataTypeAttribute:disableRegExcomo System.ComponentModel.DataAnnotations.EmailAddressAttribute, System.ComponentModel.DataAnnotations.UrlAttributey System.ComponentModel.DataAnnotations.PhoneAttribute). Esto ayuda a reducir la vulnerabilidad de seguridad, como evitar la posibilidad de un ataque por denegación de servicio mediante expresiones regulares específicas.
En .NET Framework 4.6.1, esta configuración de aplicación para deshabilitar el uso de RegEx se estableció false en de forma predeterminada. A partir de .NET Framework 4.7.2, este modificador de configuración se establece en true de forma predeterminada para reducir aún más la vulnerabilidad de seguridad para las aplicaciones web dirigidas a .NET Framework 4.7.2 y versiones posteriores.

Sugerencia

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

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

Las APIs afectadas

No se puede detectar a través del análisis de API.

Windows Presentation Foundation (WPF)

Comportamiento de las teclas rápidas mejorado en WPF

Detalles

Se ha modificado el comportamiento de la información sobre claves para aportar paridad con el comportamiento en Microsoft Word y el Explorador de Windows. Al comprobar si el estado de la sugerencia de tecla está habilitado o no cuando se presiona SystemKey (en concreto, Key o F11), WPF gestiona las teclas de sugerencia adecuadamente. Las teclas de acceso rápido ahora cierran un menú incluso cuando se abre con el ratón.

Sugerencia

No disponible

Nombre Importancia
Ámbito Borde
Versión 4.7.2
Tipo Tiempo de ejecución

Las APIs afectadas

No se puede detectar a través del análisis de API.