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

En este artículo se enumeran los problemas de compatibilidad de aplicaciones que se introdujeron en .NET Framework 4.6, 4.6.1 y 4.6.2.

.NET Framework 4.6

ASP.NET

GridView con AllowCustomPaging establecido en true puede desencadenar el evento PageIndexChanging al salir de la última página de la vista

Detalles

Un error en .NET Framework 4.5 hace que en ocasiones no se desencadene System.Web.UI.WebControls.GridView.PageIndexChanging para los elementos System.Web.UI.WebControls.GridView en los que se ha habilitado System.Web.UI.WebControls.GridView.AllowCustomPaging.

Sugerencia

Este problema se ha corregido en .NET Framework 4.6 y se puede solucionar mediante la actualización a esa versión de .NET Framework. Como una solución alternativa, la aplicación puede realizar una BindGrid explícita en cualquier método Page_Load que cumpla estas condiciones (la System.Web.UI.WebControls.GridView está en la última página y LastSystem.Web.UI.WebControls.GridView.PageSize es diferente de System.Web.UI.WebControls.GridView.PageSize). Como alternativa, la aplicación se puede modificar para permitir la paginación (en lugar de la paginación personalizada), dado que ese escenario no ilustra el problema.

NOMBRE Valor
Ámbito Secundaria
Versión 4.5
Tipo Tiempo de ejecución

API afectadas

Core

Un elemento ConcurrentDictionary serializado en .NET Framework 4.5 con NetDataContractSerializer no se puede deserializar en .NET Framework 4.5.1 ni 4.5.2

Detalles

Debido a los cambios internos en el tipo, los objetos ConcurrentDictionary<TKey,TValue> que se serializaron con .NET Framework 4.5 mediante System.Runtime.Serialization.NetDataContractSerializer no se pueden deserializar en .NET Framework 4.5.1 o 4.5.2. Tenga en cuenta que a la inversa sí funciona (la serialización con .NET Framework 4.5.x y la deserialización con .NET Framework 4.5). Del mismo modo, la serialización entre todas las versiones 4.x funciona con .NET Framework 4.6. La serialización y deserialización con una única versión de .NET Framework no se ve afectada.

Sugerencia

Si es necesario serializar y deserializar un objeto System.Collections.Concurrent.ConcurrentDictionary<TKey,TValue> entre .NET Framework 4.5 y .NET Framework 4.5.1/4.5.2, se debe usar un serializador diferente, como System.Runtime.Serialization.DataContractSerializer, en vez de System.Runtime.Serialization.NetDataContractSerializer. Este problema se resolvió en .NET Framework 4.6, por lo que otra posible solución es actualizar a esta versión de .NET Framework.

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

API afectadas

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

AppDomainSetup.DynamicBase ya no es aleatorio debido a UseRandomizedStringHashAlgorithm

Detalles

Antes de .NET Framework 4.6, el valor de DynamicBase era aleatorio entre los dominios de aplicación, o bien entre los procesos si UseRandomizedStringHashAlgorithm estaba habilitado en el archivo de configuración de la aplicación. A partir de .NET Framework 4.6, DynamicBase devolverá un resultado estable entre otras instancias de una aplicación en ejecución y entre otros dominios de aplicación. Las bases dinámicas seguirán siendo diferentes para cada aplicación; este cambio solo quita el elemento de nomenclatura aleatorio para otras instancias de la misma aplicación.

Sugerencia

Tenga en cuenta que habilitar UseRandomizedStringHashAlgorithm no dará como resultado que DynamicBase sea aleatorio. Si se necesita una base aleatoria, se debe generar en el código de la aplicación, en lugar de hacerlo a través de esta API.

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

API afectadas

Las llamadas a Attribute.GetCustomAttributes en una propiedad de indizador ya no inician excepciones AmbiguousMatchException si es posible resolver la ambigüedad por el tipo de índice

Detalles

Antes de .NET Framework 4.6, llamar a GetCustomAttribute(s) en una propiedad de indizador que difiriera de otra propiedad solo en el tipo de índice daba lugar a una instancia de System.Reflection.AmbiguousMatchException. A partir de .NET Framework 4.6, los atributos de la propiedad se devolverán correctamente.

Sugerencia

Tenga en cuenta que GetCustomAttribute(s) ahora funcionará con mayor frecuencia. Si anteriormente alguna aplicación se basaba en el elemento System.Reflection.AmbiguousMatchException, ahora se debería usar una reflexión para buscar varios indizadores de forma explícita en su lugar.

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

API afectadas

Los generadores de perfiles no enumeran COR_PRF_GC_ROOT_HANDLE

Detalles

En .NET Framework v4.5.1, el método RootReferences2() de la API de generación de perfiles de manera incorrecta nunca devuelve COR_PRF_GC_ROOT_HANDLE (en su lugar se devuelven como COR_PRF_GC_ROOT_OTHER). Este problema se corrigió a partir de .NET Framework 4.6.

Sugerencia

Este problema se ha corregido en .NET Framework 4.6 y se puede solucionar mediante la actualización a esa versión de .NET Framework.

NOMBRE Valor
Ámbito Secundaria
Versión 4.5.1
Tipo Tiempo de ejecución

API afectadas

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

Los elementos EventListener de ETW no capturan eventos de proveedores con palabras clave explícitas (como el proveedor de la TPL)

Detalles

Los elementos EventListener de ETW con una máscara de palabra clave en blanco no capturarán correctamente los eventos de proveedores con palabras clave explícitas. En .NET Framework 4.5, el proveedor de la TPL comenzó a suministrar palabras clave explícitas y dio pie a este problema. En .NET Framework 4.6, se actualizaron los elementos EventListener para evitar este problema.

Sugerencia

A modo de solución alternativa para este problema, reemplaza las llamadas a EnableEvents(EventSource, EventLevel) por llamadas a la sobrecarga EnableEvents que especifica de forma explícita que la máscara «any keywords» debe usar EnableEvents(eventSource, level, unchecked((EventKeywords)0xFFFFffffFFFFffff)).

Este problema se resolvió en .NET Framework 4.6, por lo que otra posible solución es actualizar a esta versión de .NET Framework.

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

API afectadas

En el calendario persa ahora se usa el algoritmo Hijri solar

Detalles

A partir de .NET Framework 4.6, en la clase System.Globalization.PersianCalendar se usa el algoritmo Hijri solar. La conversión de fechas entre System.Globalization.PersianCalendar y otros calendarios puede producir un resultado ligeramente diferente a partir de .NET Framework 4.6 para las fechas anteriores a 1800 o posteriores a 2023 (del calendario gregoriano). Además, PersianCalendar.MinSupportedDateTime ahora es March 22, 0622 en lugar de March 21, 0622.

Sugerencia

Tenga en cuenta que algunas fechas tempranas o tardías pueden ser ligeramente diferentes cuando se usa PersianCalendar en .NET Framework 4.6. Además, al serializar fechas entre procesos que puedan ejecutarse en diferentes versiones de .NET Framework, no las guarde como cadenas de fecha de PersianCalendar (ya que estos valores pueden ser diferentes).

NOMBRE Valor
Ámbito Secundaria
Versión 4.6
Tipo Tiempo de ejecución

API afectadas

Los objetos Reflection ya no se pueden pasar desde el código administrado a los clientes DCOM fuera de proceso

Detalles

Los objetos de reflexión ya no se pueden pasar desde el código administrado a los clientes DCOM fuera de proceso. Afecta a los siguientes tipos:

Las llamadas a IMarshal para el objeto devuelven E_NOINTERFACE.

Sugerencia

Actualice el código de serialización para que funcione con objetos que no sean de reflexión.

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

API afectadas

TargetFrameworkName para el dominio de aplicación predeterminado ya no tiene un valor NULL como valor predeterminado si no se establece

Detalles

System.AppDomainSetup.TargetFrameworkName anteriormente tenía un valor NULL en el dominio de aplicación predeterminado, a menos que se estableciera de forma explícita. A partir de la versión 4.6, la propiedad System.AppDomainSetup.TargetFrameworkName del dominio de aplicación predeterminado tendrá un valor predeterminado derivado del elemento TargetFrameworkAttribute (si hay alguno presente). Los dominios de aplicación no predeterminados continuarán heredando su propiedad System.AppDomainSetup.TargetFrameworkName del dominio de aplicación predeterminado (que no tendrá un valor NULL como valor predeterminado en la versión 4.6) a menos que se invalide de forma explícita.

Sugerencia

El código debería actualizarse para no depender de que TargetFrameworkName establezca un valor nulo como valor predeterminado. Si es necesario que esta propiedad continúe evaluándose como un valor nulo, puede establecerse en dicho valor de forma explícita.

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

API afectadas

X509Certificate2.ToString(Boolean) ahora no se inicia cuando .NET no puede controlar el certificado

Detalles

En .NET Framework 4.5.2 y versiones anteriores, este método iniciaba una excepción si se pasaba true para el parámetro detallado y había certificados instalados no admitidos por .NET Framework. Ahora, el método se realizará correctamente y devolverá una cadena válida que omite las partes inaccesibles del certificado.

Sugerencia

Cualquier código que dependa de X509Certificate2.ToString(Boolean) se debe actualizar para esperar que la cadena devuelta pueda excluir algunos datos del certificado (como la clave pública, la clave privada y las extensiones) en algunos casos en los que anteriormente se habría iniciado la API.

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

API afectadas

data

No se puede intentar una conexión TCP/IP a una base de datos de SQL Server que se resuelve en localhost

Detalles

En .NET Framework 4.6 y 4.6.1, el intento de una conexión TCP/IP a una base de datos de SQL Server que se resuelve en localhost produce el error «Se ha producido un error relacionado con la red o específico de la instancia mientras se establecía una conexión con SQL Server. No se encontró el servidor o no era accesible. Compruebe que el nombre de la instancia es correcto y que SQL Server está configurado para admitir conexiones remotas. (proveedor: Interfaces de red de SQL, error: 26 - Error al buscar el servidor o la instancia especificada)»

Sugerencia

Este problema se ha resuelto y se ha restaurado el comportamiento anterior, en .NET Framework 4.6.2. Para conectarse a una base de datos de SQL Server que se resuelve en localhost, actualice a .NET Framework 4.6.2.

NOMBRE Valor
Ámbito Secundaria
Versión 4.6
Tipo Tiempo de ejecución

API afectadas

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

instantáneas

Los valores NULL de fusionador no son visibles en el depurador hasta un paso posterior

Detalles

Un error en .NET Framework 4.5 hace que los valores establecidos mediante una operación de fusión NULL no sean visibles en el depurador inmediatamente después de ejecutar la operación de asignación cuando se ejecuta en la versión de 64 bits de la plataforma.

Sugerencia

Una ejecución paso a paso adicional en el depurador hará que el valor local o del campo se actualice correctamente. Ademas, este problema se ha corregido en .NET Framework 4.6; la actualización a esa versión debería solucionar el problema.

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

API afectadas

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

Redes

ContentDisposition DateTimes devuelve una cadena ligeramente diferente

Detalles

Se han actualizado las representaciones de cadena de los elementos System.Net.Mime.ContentDisposition, a partir de la versión 4.6, para que representen siempre el componente de hora de un elemento System.DateTime con dos dígitos. La finalidad es cumplir con RFC822 y RFC2822. De este modo, ToString() devuelve una cadena ligeramente diferente en escenarios de la versión 4.6 en los que uno de los elementos de hora de la disposición era anterior a las 10:00. Tenga en cuenta que los elementos ContentDisposition a veces se serializan convirtiéndolos en cadenas, por lo que debería revisarse cualquier operación ToString(), serialización o llamada a GetHashCode.

Sugerencia

No espere que las representaciones de cadena de elementos ContentDisposition de otras versiones de .NET Framework se comparen correctamente entre sí. Vuelva a convertir las cadenas a elementos ContentDisposition, si fuera posible, antes de realizar una comparación.

NOMBRE Valor
Ámbito Secundaria
Versión 4.6
Tipo Tiempo de ejecución

API afectadas

Serialización

Ha cambiado el mensaje de excepción para el error de serialización de DataContract en el caso de un tipo desconocido

Detalles

A partir de .NET Framework 4.6, se ha clarificado el mensaje de excepción dado si no se puede serializar o deserializar System.Runtime.Serialization.DataContractSerializer o System.Runtime.Serialization.Json.DataContractJsonSerializer debido a que faltan "tipos conocidos".

Sugerencia

Las aplicaciones no deben depender de mensajes de excepción específicos. Si una aplicación depende de este mensaje, se puede actualizar para que espere el mensaje nuevo o, preferiblemente, cambiarla para que solo dependa del tipo de excepción.

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

API afectadas

Instalación e implementación

Cambios en las versiones de producto en .NET Framework 4.6 y versiones posteriores

Detalles

El control de versiones del producto ha cambiado desde las versiones anteriores de .NET Framework y especialmente .NET Framework 4, 4.5, 4.5.1 y 4.5.2. Estos son los cambios detallados:

  • El valor de la entrada Version en la clave HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full ha cambiado a 4.6.xxxxx para .NET Framework 4.6 y sus versiones secundarias, y a 4.7.xxxxx para .NET Framework 4.7 y 4.7.1. En .NET Framework 4.5, 4.5.1 y 4.5.2, tenía el formato 4.5.xxxxx.
  • El control de versiones de producto y archivo para los archivos de .NET Framework ha cambiado con respecto al esquema de control de versiones anterior de 4.0.30319.x a 4.6.X.0 para .NET Framework 4.6 y sus versiones secundarias, y a 4.7.X.0 para .NET Framework 4.7 y 4.7.1. Puede ver estos valores nuevos si examina las Propiedades del archivo después de hacer clic con el botón derecho en un archivo.
  • Los atributos AssemblyFileVersionAttribute y AssemblyInformationalVersionAttribute de ensamblados administrados tienen valores Version con el formato 4.6.X.0 para .NET Framework 4.6 y sus versiones puntuales, y 4.7.X.0 para .NET Framework 4.7 y 4.7.1.
  • En .NET Framework 4.6, 4.6.1, 4.6.2, 4.7 y 4.7.1, la propiedad Environment.Version devuelve la cadena de versión no editable 4.0.30319.42000. En .NET Framework 4, 4.5, 4.5.1 y 4.5.2, devuelve cadenas de versión con el formato 4.0.30319.xxxxx (por ejemplo, "4.0.30319.18010"). Tenga en cuenta que no se recomienda que el código de la aplicación tome nuevas dependencias en la propiedad Environment.Version.

Para obtener más información, vea Cómo: Determinar qué versiones de .NET Framework están instaladas.

Sugerencia

En general, las aplicaciones deben depender de las técnicas recomendadas para detectar elementos como la versión del tiempo de ejecución de .NET Framework y el directorio de instalación:

Importante

El nombre de la subclave es NET Framework Setup, no .NET Framework Setup.

  • Para determinar la ruta de acceso de directorio a Common Language Runtime de .NET Framework, llame al método RuntimeEnvironment.GetRuntimeDirectory().
  • Para obtener la versión de CLR, llame al método RuntimeEnvironment.GetSystemVersion(). Para .NET Framework 4 y sus versiones secundarias (.NET Framework 4.5, 4.5.1, 4.5.2 y .NET Framework 4.6, 4.6.1, 4.6.2, 4.7 y 4.7.1), devuelve la cadena v4.0.30319.
NOMBRE Valor
Ámbito Secundaria
Versión 4.6
Tipo Tiempo de ejecución

API afectadas

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

En .NET Framework 4.6 no se usa una versión de 4.5.x.x al registrarse a sí mismo en el Registro

Detalles

Como se podría esperar, la clave de versión que se establece en el Registro (en HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\NET Framework Setup\NDP\v4\Full) para .NET Framework 4.6 comienza con "4.6", no con "4.5". Las aplicaciones que dependen de estas claves del Registro para saber qué versiones de .NET Framework están instaladas en un equipo se deben actualizar para entender que 4.6 es una nueva versión posible, y que es compatible con las versiones 4.5.x anteriores.

Sugerencia

Actualice las aplicaciones que sondean una instalación de .NET Framework 4.5 examinando las claves del Registro de 4.5 para que también acepten la versión 4.6.

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

API afectadas

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

Windows Communication Foundation (WCF)

Servicios de WCF que usan NETTCP con seguridad SSL y autenticación de certificados MD5

Detalles

.NET Framework 4.6 añade TLS 1.1 y TLS 1.2 a la lista de protocolos predeterminados de SSL de WCF. Cuando los equipos cliente y servidor tienen .NET Framework 4.6 o una versión posterior instalada, se usa TLS 1.2 para la negociación. TLS 1.2 no admite la autenticación de certificados MD5. Como consecuencia, si un cliente utiliza un certificado MD5, el cliente de WCF no se podrá conectar al servicio WCF.

Sugerencia

Puede evitar este problema para que el cliente WCF pueda conectarse a un servidor WCF realizando alguno de los siguientes procedimientos:

  • Actualizar el certificado para que no use el algoritmo MD5. Esta es la solución recomendada.
  • Si la vinculación no se configura dinámicamente en el código fuente, actualice el archivo de configuración de la aplicación para usar TLS 1.1 o una versión anterior del protocolo. Esto le permite seguir usando un certificado con el algoritmo hash MD5.

Advertencia

Esta solución no es recomendable, puesto que se considera que el algoritmo hash MD5 no es seguro.

El archivo de configuración siguiente realiza esta tarea:

<configuration>
  <system.serviceModel>
    <bindings>
      <netTcpBinding>
        <binding>
          <security mode= "None/Transport/Message/TransportWithMessageCredential" >
            <transport clientCredentialType="None/Windows/Certificate"
                       protectionLevel="None/Sign/EncryptAndSign"
                       sslProtocols="Ssl3/Tls1/Tls11">
            </transport>
          </security>
        </binding>
      </netTcpBinding>
    </bindings>
  </system.ServiceModel>
</configuration>

Advertencia

Esta solución no es recomendable, puesto que se considera que el algoritmo hash MD5 no es seguro.

NOMBRE Valor
Ámbito Secundaria
Versión 4.6
Tipo Tiempo de ejecución

API afectadas

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

Windows Presentation Foundation (WPF)

El acceso a los elementos seleccionados de un control DataGrid de WPF desde un controlador del evento UnloadingRow del control DataGrid puede producir una excepción NullReferenceException

Detalles

Debido a un error de .NET Framework 4.5, los controladores de eventos para los eventos DataGrid en los que se elimina una fila pueden provocar que se inicie una excepción System.NullReferenceException si tienen acceso a las propiedades System.Windows.Controls.Primitives.Selector.SelectedItem o System.Windows.Controls.Primitives.MultiSelector.SelectedItems de DataGrid.

Sugerencia

Este problema se ha corregido en .NET Framework 4.6 y se puede solucionar mediante la actualización a esa versión de .NET Framework.

NOMBRE Valor
Ámbito Secundaria
Versión 4.5
Tipo Tiempo de ejecución

API afectadas

Llamar a Items.Refresh en un elemento ListBox o ListView, o una cuadrícula de datos de WPF con elementos seleccionados puede hacer que aparezcan elementos duplicados en el elemento

Detalles

En .NET Framework 4.5, llamar a ListBox.Items.Refresh desde el código con elementos seleccionados en un elemento System.Windows.Controls.ListBox puede hacer que los elementos seleccionados se dupliquen en la lista. Se produce un problema similar con System.Windows.Controls.ListView y System.Windows.Controls.DataGrid. Este problema se corrigió en .NET Framework 4.6.

Sugerencia

Una solución alternativa para este problema consiste en, mediante programación, anular la selección de los elementos antes de llamar a System.Windows.Data.CollectionView.Refresh() y volver a seleccionarlos después de que la llamada se complete. Este problema se resolvió en .NET Framework 4.6, por lo que otra posible solución es actualizar a esta versión de .NET Framework.

Value
Ámbito Secundaria
Versión 4.5
Tipo Tiempo de ejecución

API afectadas

CoerceIsSelectionBoxHighlighted

Detalles

Algunas secuencias de acciones en las que haya un control System.Windows.Controls.ComboBox y su origen de datos pueden dar como resultado una excepción System.NullReferenceException.

Sugerencia

Si es posible, actualice a .NET Framework 4.6.2.

NOMBRE Valor
Ámbito Secundaria
Versión 4.6
Tipo Tiempo de ejecución

API afectadas

Problema de enlace de IsSelected de ListBoxItem con ObservableCollection<T>.Move

Detalles

Las llamadas a Move(Int32, Int32) o MoveItem(Int32, Int32) en una colección enlazada a un control System.Windows.Controls.ListBox con elementos seleccionados puede provocar un comportamiento incorrecto en la selección o anulación de selecciones futuras de elementos System.Windows.Controls.ListBox.

Sugerencia

Las llamadas a System.Collections.ObjectModel.Collection<T>.Remove(T) y System.Collections.ObjectModel.Collection<T>.Insert(Int32, T) en lugar de a Move(Int32, Int32) serán la solución alternativa a este problema. Este problema se resolvió en .NET Framework 4.6, por lo que otra posible solución es actualizar a esta versión de .NET Framework.

NOMBRE Valor
Ámbito Secundaria
Versión 4.5
Tipo Tiempo de ejecución

API afectadas

Al hacer clic con el botón derecho en un encabezado de fila de DataGrid de WPF se cambia la selección del control DataGrid

Detalles

Como resultado de hacer clic con el botón derecho en una encabezado de fila de System.Windows.Controls.DataGrid seleccionado con varias filas seleccionadas, solo cambia la selección de System.Windows.Controls.DataGrid en esa fila.

Sugerencia

Este problema se ha corregido en .NET Framework 4.6 y se puede solucionar mediante la actualización a esa versión de .NET Framework.

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

API afectadas

WPF genera un proceso de wisptis.exe que puede inmovilizar el mouse

Detalles

En la versión 4.5.2 apareció un problema que hace que se genere wisptis.exe y que puede inmovilizar la entrada del mouse.

Sugerencia

Una corrección para este problema está disponible en una versión de servicio de .NET Framework 4.5.2 (paquete acumulativo de revisiones 3026376), o bien mediante la actualización a .NET Framework 4.6.

NOMBRE Valor
Ámbito Major
Versión 4.5.2
Tipo Tiempo de ejecución

API afectadas

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

La revisión ortográfica de WPF en controles habilitados para texto no funcionará en Windows 10 para los idiomas no incluidos en la lista de idiomas de entrada del sistema operativo

Detalles

Cuando se ejecuta en Windows 10, es posible que el corrector ortográfico no funcione para los controles habilitados para texto de WPF porque las funciones de revisión ortográfica de la plataforma solo están disponibles para los idiomas que aparecen en la lista de idiomas de entrada. En Windows 10, al agregar un idioma a la lista de teclados disponibles, Windows descarga e instala automáticamente un paquete de características previa petición (Feature on Demand, FOD) que proporciona funciones de revisión ortográfica. Al agregar el idioma a la lista de idiomas de entrada, se admitirá el corrector ortográfico.

Sugerencia

Tenga en cuenta que el idioma o el texto que se va a revisar se debe agregar como un idioma de entrada para que el corrector ortográfico funcione en Windows 10.

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

API afectadas

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

Las ventanas de WPF se representan sin recortes al ampliarse fuera de un monitor

Detalles

En .NET Framework 4.6 ejecutado en Windows 8 y versiones posteriores, se representa toda la ventana sin recortes cuando se amplía más allá de una única pantalla en un escenario de varios monitores. Esto es diferente de las versiones anteriores de .NET Framework, en las que se recortaban las ventanas de WPF que se ampliaban más allá de una pantalla.

Sugerencia

Este comportamiento (si hay que recortar o no) se puede establecer de manera explícita mediante el elemento <EnableMultiMonitorDisplayClipping> de <appSettings> en el archivo de configuración de la aplicación, o bien estableciendo la propiedad EnableMultiMonitorDisplayClipping al inicio de la aplicación.

NOMBRE Valor
Ámbito Secundaria
Versión 4.6
Tipo Tiempo de ejecución

API afectadas

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

.NET Framework 4.6.1

Herramientas

Contract.Invariant o Contract.Requires<TException> no consideran que String.IsNullOrEmpty sea puro

Detalles

Para las aplicaciones que tienen como destino .NET Framework 4.6.1, si el contrato invariable para Contract.Invariant o el contrato de condición previa para Requires llama al método String.IsNullOrEmpty, el sistema de reescritura emite la advertencia del compilador CC1036: "Se detectó llamada al método "System.String.IsNullOrWhiteSpace(System.String)" sin [Pure] en el método". Se trata de una advertencia del compilador en lugar de un error del compilador.

Sugerencia

Este comportamiento se solucionó en Problema de GitHub #339. Para eliminar esta advertencia, puede descargar y compilar una versión actualizada del código fuente para la herramienta Contratos de código desde GitHub. La información de descarga se encuentra en la parte inferior de la página.

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

API afectadas

Windows Presentation Foundation (WPF)

Desplazamiento de elementos de una lista plana con elementos con alto en píxeles diferente

Detalles

Cuando un control System.Windows.Controls.ItemsControl muestra una colección mediante la virtualización (IsVirtualizing=true) y el desplazamiento de elementos (ScrollUnit=Item), y cuando el control se desplaza para mostrar un elemento cuyo alto en píxeles difiere de sus vecinos, el System.Windows.Controls.VirtualizingStackPanel recorre en iteración todos los elementos de la colección. La interfaz de usuario no responde durante esta iteración. Esta iteración se produce en otras circunstancias, incluso en versiones anteriores de .NET Framework. Por ejemplo, se produce al desplazarse por píxeles (ScrollUnit=Pixel) al encontrar un elemento con otro alto en píxeles y, al desplazar por elementos datos jerárquicos (como en un control System.Windows.Controls.TreeView o un System.Windows.Controls.ItemsControl con la agrupación habilitada) al encontrar un elemento con un número de elementos descendientes distinto al de sus vecinos. Para el caso de desplazamiento por elementos y otra altura en píxeles, la iteración se introdujo en .NET Framework 4.6.1 para corregir errores en el diseño de los datos jerárquicos. No es necesario si los datos son planos (sin jerarquía), en cuyo caso, .NET Framework 4.6.2 no realiza la iteración.

Sugerencia

Si la iteración se produce en .NET Framework 4.6.1, pero no en versiones anteriores (es decir, si System.Windows.Controls.ItemsControl realiza el desplazamiento de elementos en una lista plana con elementos de diferentes alturas en píxeles), hay dos soluciones:

  • Instalar .NET Framework 4.6.2.
  • Instalar la revisión HR 1605 para .NET Framework 4.6.1.
NOMBRE Valor
Ámbito Secundaria
Versión 4.6.1
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.

Se produce un error inesperado en la revisión ortográfica de WPF

Detalles

Esto incluye una serie de problemas del corrector ortográfico de WPF:

  • En ocasiones, el corrector ortográfico de WPF inicia una excepción System.Runtime.InteropServices.COMException.
  • Se produce un error en el corrector ortográfico de WPF con una excepción UnauthorizedAccessException cuando las aplicaciones se inician mediante "Ejecutar como otro usuario".
  • El corrector ortográfico de WPF identifica incorrectamente errores ortográficos en palabras compuestas, como "Hausnummer" en alemán.

Sugerencia

Problema 1: esto se ha solucionado en .NET Framework 4.6.2. Problema 2: el corrector ortográfico de WPF ya no se admite cuando las aplicaciones se inician con la opción "Ejecutar como otro usuario". A partir de .NET Framework 4.6.2, las aplicaciones iniciadas de esta manera ya no se bloquean de forma inesperada; en su lugar, el corrector ortográfico se deshabilita en modo silencioso. Problema 3: esto se ha solucionado en .NET Framework 4.6.2.

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.

.NET Framework 4.6.2

Datos

No se puede intentar una conexión TCP/IP a una base de datos de SQL Server que se resuelve en localhost

Detalles

En .NET Framework 4.6 y 4.6.1, el intento de una conexión TCP/IP a una base de datos de SQL Server que se resuelve en localhost produce el error «Se ha producido un error relacionado con la red o específico de la instancia mientras se establecía una conexión con SQL Server. No se encontró el servidor o no era accesible. Compruebe que el nombre de la instancia es correcto y que SQL Server está configurado para admitir conexiones remotas. (proveedor: Interfaces de red de SQL, error: 26 - Error al buscar el servidor o la instancia especificada)»

Sugerencia

Este problema se ha resuelto y se ha restaurado el comportamiento anterior, en .NET Framework 4.6.2. Para conectarse a una base de datos de SQL Server que se resuelve en localhost, actualice a .NET Framework 4.6.2.

NOMBRE Valor
Ámbito Secundaria
Versión 4.6
Tipo Tiempo de ejecución

API afectadas

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

Se ha quitado el período de bloqueo del grupo de conexiones para Azure SQL Database

Detalles

A partir de .NET Framework 4.6.2, para las solicitudes de apertura de conexión a instancias de Azure SQL Database conocidas (*.database.windows.net, *.database.chinacloudapi.cn, *.database.usgovcloudapi.net, *.database.cloudapi.de), se ha quitado el período de bloqueo del grupo de conexiones y los errores de apertura de conexiones no se almacenan en caché. Se llevarán a cabo intentos por recuperar solicitudes abiertas de conexión casi inmediatamente después de los errores de conexión transitorios. Este cambio permite que el intento de apertura de conexión a instancias de Azure SQL Database se reintente de inmediato, lo que mejora el rendimiento de las aplicaciones habilitadas para la nube. Para todos los otros intentos de conexión, se sigue aplicando el período de bloqueo del grupo de conexiones.

En .NET Framework 4.6.1 y versiones anteriores, cuando una aplicación encuentra un error de conexión transitorio al conectarse a una base de datos, no es posible reintentar rápidamente la conexión, porque el grupo de conexiones almacena el error en caché y vuelve a generarlo entre cinco segundos y un minuto. Para obtener más información, vea Agrupación de conexiones de SQL Server (ADO.NET). Este comportamiento causa problemas en las conexiones a bases de datos SQL de Azure, las que habitualmente presentan errores transitorios de los que se recuperan dentro de unos pocos segundos. La característica de bloqueo del grupo de conexiones significa que la aplicación no se puede conectar a la base de datos durante un período prolongado, incluso si la base de datos está disponible y la aplicación tiene que representarse en cuestión de segundos.

Sugerencia

Si no quiere este comportamiento, se puede configurar el período de bloqueo del grupo de conexiones si se establece la propiedad System.Data.SqlClient.SqlConnectionStringBuilder.PoolBlockingPeriod introducida en .NET Framework 4.6.2. El valor de la propiedad es un miembro de la enumeración System.Data.SqlClient.PoolBlockingPeriod que puede tener cualquiera de los tres valores:

El comportamiento anterior se puede restaurar al establecer la propiedad System.Data.SqlClient.SqlConnectionStringBuilder.PoolBlockingPeriod en AlwaysBlock.

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

API afectadas

Globalización

Ahora se admiten las categorías de la versión 8.0 del estándar Unicode

Detalles

En .NET Framework 4.6.2, los datos Unicode se han actualizado de la versión 6.3 del estándar Unicode a la versión 8.0. Al solicitar las categorías de caracteres Unicode en .NET Framework 4.6.2, es posible que algunos de los resultados no coincidan con los de versiones anteriores de .NET Framework. Este cambio afecta principalmente a las sílabas cheroquis y a las marcas de tono y signos de vocal Nuevo Tai Lue.

Sugerencia

Revise el código y quite o cambie la lógica que depende de categorías de caracteres Unicode codificados de forma rígida.

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

API afectadas

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

RSACng.VerifyHash ahora devuelve False para los errores de comprobación

Detalles

A partir de .NET Framework 4.6.2, este método devuelve False si la propia firma tiene un formato incorrecto. Ahora devuelve false para los errores de comprobación. En .NET Framework 4.6 y 4.6.1, el método inicia una excepción System.Security.Cryptography.CryptographicException si la propia firma tiene el formato incorrecto.

Sugerencia

Se debe ejecutar el código cuya ejecución dependa del control de System.Security.Cryptography.CryptographicException en lugar de ejecutarse si se produce un error en la validación y el método devuelve False.

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

API afectadas

Cambios importantes en SignedXml y EncryptedXml

Detalles

En .NET Framework 4.6.2, las revisiones de seguridad de System.Security.Cryptography.Xml.SignedXml y System.Security.Cryptography.Xml.EncryptedXml generan otros comportamientos en tiempo de ejecución. Por ejemplo:

  • Si un documento tiene varios elementos con el mismo atributo id y una firma está destinada a uno de esos elementos como la raíz de la firma, el documento ahora se considerará no válido.
  • Los documentos con algoritmos de transformación de XPath no canónicos en las referencias ahora se consideran no válidos.
  • Los documentos con algoritmos de transformación de XSLT no canónicos en las referencias ahora se consideran no válidos.
  • Los programas que usen firmas separadas de recurso externo no podrán hacerlo.

Sugerencia

Es posible que los desarrolladores quieran revisar el uso de XmlDsigXsltTransform y XmlDsigXsltTransform, así como los tipos derivados de Transform, ya que es posible que un receptor de documentos no pueda procesarlo.

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

API afectadas

Windows Communication Foundation (WCF)

Se quita Ssl3 de TransportDefaults de WCF

Detalles

Al usar NetTcp con seguridad de transporte y un tipo de credencial de certificado, el protocolo SSL 3 ya no es el protocolo predeterminado para negociar una conexión segura. En la mayoría de los casos no debería afectar a las aplicaciones existentes, porque TLS 1.0 siempre se ha incluido en la lista de protocolos para NetTcp. Todos los clientes deberían poder negociar una conexión usando como mínimo TLS1.0.

Sugerencia

Si se requiere Ssl3, use uno de los mecanismos de configuración siguientes para agregarlo a la lista de protocolos negociados.

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

API afectadas

Windows Presentation Foundation (WPF)

El cambio de la propiedad IsEnabled del elemento primario de un control TextBlock afecta a todos los controles secundarios

Detalles

A partir de .NET Framework 4.6.2, el cambio de la propiedad System.Windows.UIElement.IsEnabled del elemento primario de un control System.Windows.Controls.TextBlock afecta a todos los controles secundarios (como los hipervínculos y los botones) del control System.Windows.Controls.TextBlock. En .NET Framework 4.6.1 y versiones anteriores, los controles dentro de un System.Windows.Controls.TextBlock no siempre reflejaban el estado de la propiedad System.Windows.UIElement.IsEnabled del elemento System.Windows.Controls.TextBlock primario.

Sugerencia

Ninguno. Este cambio se ajusta al comportamiento esperado de los controles dentro de un control System.Windows.Controls.TextBlock.

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

API afectadas

CoerceIsSelectionBoxHighlighted

Detalles

Algunas secuencias de acciones en las que haya un control System.Windows.Controls.ComboBox y su origen de datos pueden dar como resultado una excepción System.NullReferenceException.

Sugerencia

Si es posible, actualice a .NET Framework 4.6.2.

NOMBRE Valor
Ámbito Secundaria
Versión 4.6
Tipo Tiempo de ejecución

API afectadas

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

Desplazamiento horizontal y virtualización

Detalles

Este cambio se aplica a un elemento System.Windows.Controls.ItemsControl que realiza su propia virtualización en la dirección ortogonal hacia la dirección de desplazamiento principal (el ejemplo principal es System.Windows.Controls.DataGrid con EnableColumnVirtualization="True"). Se cambió el resultado de determinadas operaciones de desplazamiento horizontal para producir resultados más intuitivos y más parecidos a los de las operaciones verticales comparables.

Las operaciones incluyen "Desplazar aquí" y "Borde derecho", para usar los nombres del menú que se obtiene al hacer clic con el botón derecho en una barra de desplazamiento horizontal. En ambos casos se calcula un desplazamiento posible y se llama a SetHorizontalOffset(Double).

Tras desplazarse hasta el desplazamiento nuevo, puede haber cambiado la definición de "aquí" o "borde derecho" porque el contenido recién desvirtualizado haya cambiado el valor de System.Windows.Controls.Primitives.IScrollInfo.ExtentWidth.

Antes de .NET Framework 4.6.2, la operación de desplazamiento simplemente usa el desplazamiento posible, aunque puede que ya no sea "aquí" o en el "borde derecho". Esto produce efectos como la miniatura de desplazamiento de "rebote", que se muestra mejor con un ejemplo. Suponga que un control System.Windows.Controls.DataGrid tiene ExtentWidth=1000 y Width=200. Un desplazamiento de «Borde derecho» usa el desplazamiento posible de 1000 - 200 = 800. Al dirigirse al desplazamiento, las columnas nuevas se desvirtualizan; supongamos que son muy amplias, por lo que System.Windows.Controls.Primitives.IScrollInfo.ExtentWidth cambia a 2000. El desplazamiento termina con HorizontalOffset=800, y la miniatura "rebota" de nuevo casi a la mitad de la barra de desplazamiento; precisamente a 800/2000 = 40 %.

El cambio es para volver a calcular un nuevo desplazamiento posible cuando se produce esta situación y volver a intentarlo. (Así es cómo funciona ya el desplazamiento vertical).

El cambio produce una experiencia más predecible e intuitiva para el usuario final, pero también podría afectar a cualquier aplicación que dependa del valor exacto de System.Windows.Controls.Primitives.IScrollInfo.HorizontalOffset después de un desplazamiento horizontal, independientemente de que la invocación la realice el usuario final o una llamada explícita a SetHorizontalOffset(Double).

Sugerencia

Una aplicación que use un valor de predicción para System.Windows.Controls.Primitives.IScrollInfo.HorizontalOffset se debe cambiar para recuperar el valor real (y el valor de System.Windows.Controls.Primitives.IScrollInfo.ExtentWidth) después de cualquier desplazamiento horizontal que pudiera cambiar System.Windows.Controls.Primitives.IScrollInfo.ExtentWidth debido a la desvirtualización.

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

API afectadas

Items.Clear no quita los duplicados de SelectedItems

Detalles

Supongamos que un Selector (con la selección múltiple habilitada) tiene duplicados en su colección System.Windows.Controls.Primitives.MultiSelector.SelectedItems: el mismo elemento aparece más de una vez. Si esos elementos se quitan del origen de datos (por ejemplo, mediante una llamada a Items.Clear), no se quitan de System.Windows.Controls.Primitives.MultiSelector.SelectedItems; solo se quita la primera instancia. Además, el uso posterior de System.Windows.Controls.Primitives.MultiSelector.SelectedItems (como SelectedItems.Clear()) puede tener problemas, como una excepción System.ArgumentException, porque System.Windows.Controls.Primitives.MultiSelector.SelectedItems contiene elementos que ya no están en el origen de datos.

Sugerencia

Si es posible, actualice a .NET Framework 4.6.2.

NOMBRE Valor
Ámbito Secundaria
Versión 4.5
Tipo Tiempo de ejecución

API afectadas

Desplazamiento de elementos de una lista plana con elementos con alto en píxeles diferente

Detalles

Cuando un control System.Windows.Controls.ItemsControl muestra una colección mediante la virtualización (IsVirtualizing=true) y el desplazamiento de elementos (ScrollUnit=Item), y cuando el control se desplaza para mostrar un elemento cuyo alto en píxeles difiere de sus vecinos, el System.Windows.Controls.VirtualizingStackPanel recorre en iteración todos los elementos de la colección. La interfaz de usuario no responde durante esta iteración. Esta iteración se produce en otras circunstancias, incluso en versiones anteriores de .NET Framework. Por ejemplo, se produce al desplazarse por píxeles (ScrollUnit=Pixel) al encontrar un elemento con otro alto en píxeles y, al desplazar por elementos datos jerárquicos (como en un control System.Windows.Controls.TreeView o un System.Windows.Controls.ItemsControl con la agrupación habilitada) al encontrar un elemento con un número de elementos descendientes distinto al de sus vecinos. Para el caso de desplazamiento por elementos y otra altura en píxeles, la iteración se introdujo en .NET Framework 4.6.1 para corregir errores en el diseño de los datos jerárquicos. No es necesario si los datos son planos (sin jerarquía), en cuyo caso, .NET Framework 4.6.2 no realiza la iteración.

Sugerencia

Si la iteración se produce en .NET Framework 4.6.1, pero no en versiones anteriores (es decir, si System.Windows.Controls.ItemsControl realiza el desplazamiento de elementos en una lista plana con elementos de diferentes alturas en píxeles), hay dos soluciones:

  • Instalar .NET Framework 4.6.2.
  • Instalar la revisión HR 1605 para .NET Framework 4.6.1.
NOMBRE Valor
Ámbito Secundaria
Versión 4.6.1
Tipo Tiempo de ejecución

API afectadas

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.

Se produce un error inesperado en la revisión ortográfica de WPF

Detalles

Esto incluye una serie de problemas del corrector ortográfico de WPF:

  • En ocasiones, el corrector ortográfico de WPF inicia una excepción System.Runtime.InteropServices.COMException.
  • Se produce un error en el corrector ortográfico de WPF con una excepción UnauthorizedAccessException cuando las aplicaciones se inician mediante "Ejecutar como otro usuario".
  • El corrector ortográfico de WPF identifica incorrectamente errores ortográficos en palabras compuestas, como "Hausnummer" en alemán.

Sugerencia

Problema 1: esto se ha solucionado en .NET Framework 4.6.2. Problema 2: el corrector ortográfico de WPF ya no se admite cuando las aplicaciones se inician con la opción "Ejecutar como otro usuario". A partir de .NET Framework 4.6.2, las aplicaciones iniciadas de esta manera ya no se bloquean de forma inesperada; en su lugar, el corrector ortográfico se deshabilita en modo silencioso. Problema 3: esto se ha solucionado en .NET Framework 4.6.2.

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.