Nueva versión de .NET Framework 4.6

Durante el lanzamiento de la nueva versión de Visual Studio 2015, Microsoft ha presentado una nueva versión del .NET Framework 4.6. En este artículo se van a comentar las novedades que incluyen esta nueva versión para los desarrolladores de .NET.

Las novedades están agrupadas por características del runtime.

Windows Presentation Foundation (WPF)

Esta tecnología es la que permite construir aplicaciones utilizando XAML en el escritorio. Visual Studio está hecho con WPF además de muchas otras aplicaciones de escritorio.

Soporte de ventanas hijas transparentes

Ahora se pueden crear ventanas hijas de una ventana principal y que estas sean transparentes. Esto solamente funciona en versiones de Windows iguales o superiores a la 8.1. Con esto se pueden crear y componen ventanas no rectangulares de primer nivel. Para achicar esta característica hay que establece la propiedad UsesPerPixelTransparency property a true en el HWndSourceParameters.

Mejoras en el soporte de DPI altos

Se ha mejorado el soporte previo que WPF tenía de High DPI. En los controles con borde se ha reducido la posibilidad de recorte cuando se activa el Layout rounding. Esta característica está habilitada de forma predeterminada si la aplicación tiene un target de .NET Framework 4.6 o superior. Para activar esta característica para aplicaciones que no están compiladas con esta versión del motor de ejecución pero que se ejecutan en .NET Framework 4.6 hay que añadir esto al fichero app.config

 <runtime>
    <AppContextSwitchOverrides 
        value="Switch.MS.Internal.DoNotApplyLayoutRoundingToMarginsAndBorderThickness=false" /> 
</runtime>

También el soporte de configuración de distintos valores de DPI para multiple monitores ahora (Multi-DPI) ahora se renderiza correctamente. Se puede deshabilitar esta característica si se desea.

Los cursores de ratón también se han actualizado, y ahora utilizando la clase System.Windows.Input.Cursor se soportan fichero .cur multi-imágenes.

Soporte táctil

El equipo de WPF ha adoptado el umbra el doble tap usando en aplicaciones UWP, que está considerado a ser un estándar de calidad de la industria. WPF utiliza la misma implementación para sistemas con Windows 8.1 o superior.

Se ha corregido un bug crítico con el sistema de táctil.

Mejoras de soporte High DPI para Windows Forms

Windows Forms, la tecnología previa a WPF para la creación de aplicaciones de escritorio también ha actualizado el soporte que tenía para High DPI. Los siguientes controles se han actualizado: ComboBox, Cursor, DataGridView, DataGridViewColumn, DataGridViewComboBoxColumn, DomainUpDown, NumericUpDown, ToolStripComboBox, ToolStripMenuItem and ToolStripSplitButton.

clip_image001

Para poder habilitar esta característica hay que añadir esta nueva configuración en el fichero app.config.

 <appSettings>
    <add key="EnableWindowsFormsHighDpiAutoResizing" value="true" />
</appSettings>

RyuJIT

RyuJIT es el nombre de la siguiente generación de compiladores Just-In-Time (JIT) para .NET. Utiliza una nueva arquitectura de altor rendimiento, que permite conseguir un alto rendimiento de procesado durante la compilación del JIT. Es mucho más rápido que el existente JIT64 que ha estado durante más de 10 años en las versiones de .NET Framework. Siempre ha habido una diferencia entre arquitecturas de 32 y 64 bits que ahora se ha eliminado con este nuevo motor de JIT.

RyuJIT está habilitado para procesadores de 64bits ejecutándose en .NET Framework 4.6. La aplicación se ejecutara en un proceso de 64bits si esta compilada en 64bits o AnyCPU (y no está marcada en como preferencia 32bits) en un sistema operativo de 64 bits. RyuJIT está también integrado en .NET Core.

Se puede leer más información sobre el proceso de diseño de RyuJIT en el blog oficial de .NET. Y también está disponible el código fuente en GitHub por si se quiere contribuir en el nuevo motor de JIT.

SIMD

Este juego de instrucciones (SIMD) que todos los procesadores incluyen, ahora se pueden utilizar desde .NET Framework para versiones de 64 bits del CLR. Dentro del espacio de nombres System.Numerics hay nuevos tipos de datos que son automáticamente reconocidos con el JIT y que generarán automáticamente código que utiliza instrucciones hardware SSE2 y AVX2, si la máquina lo soporta.

Los nuevos tipos de datos incluyen soporte para vectores de tamaño fijo de 2 o 4 elemento de precisión simple, perfectas para aplicaciones que necesites algoritmos n-dimensionales.

Para empezar a utiliza esta nueva característica se puede descargar el paquete de nuget System.Numerics.Vectors y automáticamente se utilizan las extensión SIMD del procesador.

Actualizaciones del recolector de basura

El recolector de basura se ha actualizado para reducir la latencia y mejora la utilización de la memoria. Esta actualización se ha desplegado en grandes cargas de trabajo como Office 365 y Bing. En estos servicios que contienen miles de máquinas se ha observado una mejora de rendimiento en esos servicios. Solamente se ha desplegado la nueva versión del .NET Framework no se han realizado cambios de código.

El recolector de basura maneja mejor los objetos de memoria anclados. Ahora es posible compactar la memoria alrededor de estos objetos anclados en memoria y tener una disposición de memoria más optimizada. Esto ha permitido mejorar la gestión de memoria en aplicaciones donde se ha un uso intensivo de anclaje de objetos en memoria.

La promoción de objetos de la generación 1 a la generación 2 se ha mejorado para que sea más eficiente. Ahora el recolector de basura intenta utiliza la memoria libre de una generación antes de tener que reservar un nuevo segmento de memoria.

El recolector de basura tiene un nuevo modo de trabajo que evita las recolecciones de memoria si ciertas configuraciones de memoria son satisfechas. Este nuevo método está pensado para cargas de trabajo de baja latencia en el que no se puede interrumpir al proceso con una recolección de memoria. Esto permite que a través de una API la aplicación pueda especificar cuanta memoria tiene que estar disponible para realizar una operación antes de entrar en una región de no recolector de basura. Así de esta manera el recolector de basura solamente se iniciará cuando explícitamente se llame al método GC.Collect o la memoria especificada se acabe.

Windows Communication Foundation (WCF)

WCF soporta ahora versión de SSL TLS1,2, además delas existentes SSL 3.0 y TLS 1.0 cuando se utilizan el transporte NetTcp y la seguridad de autenticación de cliente. Ahora es posible seleccionar que protocolo se usarán además de poder deshabilitar otros protocolos más antiguos e inseguros.

Ahora se soporte la capacidad de enviar mensajes de HTTP utilizando diferentes conexiones HTTP.

Windows Workflow (WF)

Se ha añadido una nueva configuración que especifica el número de segundos que el flujo de trabajo mantendrá una petición de operación fuera de orden antes de que la petición “non-protocol” genere un timeout. Una petición “non-protocol” es una actividad favorita que no está relacionada con una actividad Receive. Se puede activar añadiendo esto al fichero de configuración:

 <appSettings> 
    <add key="microsoft:WorkflowServices:FilterResumeTimeoutInSeconds" value="60"/> 
</appSettings>

Mejoras en ADO.NET

ADO.NET soporta la característica de SQL Server 2016 “Always Encypted” que permite cifrar los valores de ciertas columnas en SQL Server 2016. Se puede conocer más sobre el soporte de esta característica en el blog de seguridad de SQL Server.

Async

La nueva clase System.Threading.AsyncLocal te permite guardar información ambiental con afinidad al thread que se está ejecutando, para poder persistir información que se puede mover fuera el ámbito del thread.

System.Threading.Tasks.Task utilizan la Información heredada de la referencial cultural y de la referencia cultura de la interfaz de usuario. Para más información sobre este tema se puede ver el articulo “Cultura and task-based asynchronous opertions”.

Mejoras en el soporte de red

Windows 10 incluye un nuevo algoritmo para red de alto rendimiento que hace que la máquina local utilice mejor los recursos para el uso de los puertos de salida de TCP. El .NET Framework 4.6 soporta ese nuevo algoritmo, haciendo que las aplicaciones de .NET se beneficien de este nuevo soporte. En versiones previas de Windows hay un límite artificial de conexiones concurrentes (típicamente 16384), el cual puede causar que se agoten los puertos bajo una gran demanda de recursos.

En el .NET Framework 4.6, el valor del enumerado System.Net.Sockets.SocketOptionName.ReuseUnicastPort se ha añadido y la propiedad para permitir habilitar el reuso de puertos locales.

De manera predeterminada, el valor de System.Net.ServicePointManager.ReusePort está a falso a menos que la propiedad HWRPortREuseOnSockeBind del registro HKLM\SOFTWARE\Microsoft.NETFramework\v4.0.30319 este a 0x1. Esto hace que las conexiones de salida de TCP utilicen este nuevo algoritmo. Así de esta manera conexiones desde System.Net.Http.HttpClient y System.Net.HttpWebRequest utilizarán este nuevo valor de para Windows 10.

En la clase System.Uri se ha añadido una nueva propiedad llamada IdnHost, que permite tener mejor soporte de nombres de dominios internacionales y PunyCode.

Rendimiento del cargador de ensamblados del CLR

El cargador de ensamblados utiliza ahora la memoria de forma más eficiente descargando imágenes IL después de que la imagen nativa (generada por NGEN) haya sido cargada. Este cambio beneficia a las aplicaciones que utilizan mucha memoria virtual en procesos de 32bits (como por ejemplo Visual Studio) y además salvaguarda memoria física.

Actualizaciones del soporte de criptografía

Se han actualizado las apis de criptografía de .NET Framework para dar soporte a las nuevas API de criptografía de Windows CNG. Hasta la fecha .NET Framework utilizaba una versión previa de las APIs del sistema operativo para el soporte de criptografía. De esta manera se soportan nuevas algoritmos de cifrado.

Este es un resumen de las novedades.

  • Cifrado RSA. Añadido soporte para desplazamiento OAEP utilizando la familia de funciones hash SHA-2.
  • Firmado RSA. Añadido soporta para desplazamiento PSS.
  • Usabilidad de RSA. Mejorada el área de exposición de la API.
  • Usabilidad de RSA. Añadido los métodos X509Certificate2.GetRSAPublicKey() y X509Certificate2.GetRSAPrivateKey(), devuelven nulo para certificados que no son RSA, usan una implementación CNG cuando es posible.

Tiempo Unix

Ahora se puede convertir valores de tiempo que están almacenados en formato Unix de forma más cómoda. Esto es muy útil cuando traspasan valores entre lenguajes como clientes de JavaScript desde servidores de .NET. Se han las siguientes API para dar cabida a esta nueva funcionalidad.

  • static DateTimeOffset FromUnixTimeSeconds(long seconds)
  • static DateTimeOffset FromUnixTimeMilliseconds(long milliseconds)
  • long DateTimeOffset.ToUnixTimeSeconds()
  • long DateTimeOffset.ToUnixTimeMilliseconds()

Switches de compatibilidad

Se ha creado una clase llamada AppContext que permite a las librerías habilitar o deshabilitar switches dentro de la infraestructura del Framework. Establece un contrato desacoplado entre componentes que permite activar o desactivar características.

De esta manera AppContext permite que las librerías expongan switches para modificar el funcionamiento de las librerías.

Luis Guerrero.

Technical Evangelist Microsoft Azure

@guerrerotook