0

[Article] Novedades! .Net 5 Preview 8

Hace unos días se encuentra disponible una nueva versión preview de .Net 5. Esta es la número ocho, las siguientes serán release candidates hasta noviembre. A diferencia de otras preview, esta es un versión completa, esto quiere decir que están incluidas casi todas las características de la versión final.

Para los que todavía no descargaron la versión .Net 5 pueden hacerlo desde los siguientes links:

.Net 5.0 Preview 8

Imágenes de contenedores

Instalador de Snap

Notas de la versión

Problemas conocidos

Rastreador de problemas de GitHub

En post anteriores, vimos muchas de las mejoras que se fueron incluyendo preview tras preview, como compatibilidad con windows ARM64, mejoras de rendimiento, mejor compatibilidad con librerías de Mono, Blazor y muchas más, teniendo siempre como objetivo la unificación de los 2 frameworks actuales. Entremos en más detalle.

.Net 5

C# 9 y F# 5 son parte de la versión .Net 5., vienen incluidas en el SDK. Para los que ovlidan Visual Basic, siempre estará en nuestro corazón, ahora también está incluido en el SDK, aunque no tiene mejoras, pero sí, un mejor soporte para Application Framework en .Net Core.

Algo que está tomando cada vez más fuerza, es C# Source Generators, seguramente lo veremos en un futuro post. Esta es una nueva característica del compilador de C#. Es un generador de código que ejecuta fragmentos de código durante la compilación y puede inspeccionar nuestra aplicación para generar archivos adicionales que serán compilados junto con el resto de su código.

C# 9

El objetivo de esta versión es simplificar la sintaxis, la inmutabilidad de los datos y nuevos patrones disponibles para su uso.

Se agregó la posibilidad de poder ejecutar código en nivel más alto. Esto ayudará a las personas que están comenzando a aprender más fácilmente el lenguaje.

using System;

Console.WriteLine("Hello World!")

Inclusive, puede ayudarnos a ampliar la funcionalidad, como definir y llamar a un método o clase dentro del mismo archivo.

using System;
using System.Runtime.InteropServices;

Console.WriteLine("Hello World!");
FromWhom();
Show.Excitement("Top-level programs can be brief, and can grow as slowly or quickly in complexity as you'd like", 8);

void FromWhom()
{
    Console.WriteLine($"From {RuntimeInformation.FrameworkDescription}");
}

internal class Show
{
    internal static void Excitement(string message, int levelOf)
    {
        Console.Write(message);

        for (int i = 0; i < levelOf; i++)
        {
            Console.Write("!");
        }

        Console.WriteLine();
    }
}

Coincidencia de patrones

Podemos extraer información del valor al estar haciendo una comparación. La primera característica con propiedades. Válida si es null y luego compara el objeto.

if (context is {IsReachable: true, Length: > 1 })
{
    Console.WriteLine(context.Name);
}

Antes lo hacíamos de la siguiente manera:

if (context is object &amp;&amp; context.IsReachable &amp;&amp; context.Length > 1 )
{
    Console.WriteLine(context.Name);
}
if (context?.IsReachable &amp;&amp; context?.Length > 1 )
{
    Console.WriteLine(context.Name);
}

El siguiente ejemplo usa un patrón relacional y lógico. Nos ayuda crear un camino lógico entre valores para tomarlo.

DeliveryTruck t when t.GrossWeightClass switch
{
    < 3000 => 8.00m,
    >= 3000 and <= 5000 => 10.00m,
    > 5000 => 15.00m,
},

Nueva expresión Targe-typed

Tenemos una nueva forma de eliminar duplicaciones de tipos al construir objetos del tipo object/values.  Muchas personas prefieren usar el var, aunque otras prefieren el tipo porque la mayoría leemos de izquierda a derecha y quieren el tipo a la izquierda, segundo. Yo prefiero el var. Así que ahora podemos omitir, al hacer el new, el tipo si está del lado izquierdo.

List<string> values = new List<string>();
List<string> values = new();
var values = new List<string>();

Tools

Se han realizado mejoras en el proveedor de registro Microsoft.Extensions.Logging. Ahora, con la consola, podemos implementar CustomConsoleFormatter para tener el control sobre el formato de salida de la consola. Es posible enriquecer el formato mediante secuencias de escape VT-100 que son soportadas por las terminales modernas. Podemos detectar las no compatibles y ajustar nuestro formateador. Además, tenemos un formateador JSON integrado para enviar este tipo de estructuras a la consola.

Volcado de la depuración

A partir de la preview 8,  podemos compilar la DAC de Linux en Windows. Los volcados de procesos de .NET Core que se recopilan en Linux ahora se pueden analizar en Windows mediante WinDBG o dotnet dump analyze.

También,se pueden capturar los volcado de ELF de procesos que se ejecutan en macOS. Los volcados resultantes se pueden analizar mediante dotnet dump analyze.

Diagnóstico de carga de ensamblaje en el pipeline de eventos

Ahora es posible obtener la información de carga de ensamblado a la canalización de eventos. Podemos  utilizar  dotnet-trace  para recopilar esta información con el siguiente comando:

dotnet-trace collect --providers Microsoft-Windows-DotNETRuntime:4:4 --process-id [process ID]

Información del entorno

Se ha agregado una herramienta que nos permite imprimir la información del entorno para varios sistemas operativos y componentes de hardware. Para esto, debemos instalar la herramienta dotnet-runtimeinfo.

dotnet tool install -g dotnet-runtimeinfo
dotnet-runtimeinfo

APIs

Hay muchos cambios en la librería de .Net 5. Veamos los más importantes.

Nullable Annotations

Los tipos de referencia que aceptan valores NULL eran una característica importante de C# 8 y .NET Core 3.0. Se implementaron muchas de las que fueron planteadas, inclusive por la comunidad, hasta ahora está implementado en un 80% y se está analizando implementar el 20% restante para el RTM. Nos dejaron una gráfica del progreso de implementación.

Mejoras de rendimiento en expresiones regulares

Se ha invertido mucho tiempo en mejorar el motor Regex. Se ha logrado un rendimiento de 3 a 6 veces más, y en algunos casos mucho más. Principalmente se han hecho cambios en System.Text.RegularExpressions creando un gran impacto.

Interoperabilidad de WinRT

Se ha cambiado el modelo para admitir las API de WinRT como parte de .Net 5.0. Este nuevo sistema tiene varias ventajas:

  • Se puede desarrollar y mejorar de forma independiente del tiempo de ejecución de .NET.
  • Simétrico con sistemas de interoperabilidad proporcionados para otros sistemas operativos, como iOS y Android.
  • Puede aprovechar muchas otras características de .NET (AOT, características de C, vinculación de IL).
  • Simplifica el código base en tiempo de ejecución de .NET.

El sistema de interoperabilidad WinRT actual fue eliminado del tiempo de ejecución de .NET (y componentes asociados) como parte de .NET 5.0. Esto es un cambio de último momento. Esto significa que las aplicaciones que usan WinRT con .NET Core 3.x deberán volver a generarse y no se ejecutarán en .NET 5.0 tal cual.

Tiempo de ejecución

Se agregaron muchas características nuevas en .NET 5.0. Veamos:

Windows ARM64

Se ha agregado compatibilidad con Windows ARM64 como parte de esta versión. Se han retrasados los componentes de escritorio de Windows (Windows Forms, WPF). Windows Forms está casi listo, pero WPF no lo está, y el equipo no quiere liberar solo la mitad del componente de escritorio para Windows.

El equipo se encuentra trabajando con algunos ISV actualmente que quieren sus aplicaciones disponibles en Windows ARM64. Si nos encontramos en este escenario podemos contactar al equipo a la dirección de correo dotnet@microsoft.com para dar feedback.

API:  generador de perfiles de canalización de eventos

La canalización de eventos es una funcionalidad que fue agregada en .Net Core 2.2 para poder realizar monitoreo de rendimiento y varias funciones de diagnostico en cualquier sistema operativo. En .Net 5.0 se ha extendido esta funcionalidad para permitir a los generadores de perfiles puedan escribir en ellos.

Exportaciones nativas

Aaron Robinson, que es parte del equipo, ha estado trabajando en un proyecto de .NET Native Exports que brinda una mejor experiencia al publicar componentes .NET como bibliotecas nativas. 

Ahora podemos exportar métodos administrados a código nativo. El componente básico de la función es el soporte de API de alojamiento para UnmanagedCallersOnlyAttribute.

Implementación de aplicaciones

El equipo se ha enfocado en mejorar la implementación de aplicaciones centradas en un solo archivo y actualizar la tecnología ClicOnce para .Net Core.

Aplicaciones de un solo archivo

En el caso de esta aplicaciones, toda la aplicación y las dependencias se encuentran en un solo archivo. Esto significa que las dependencias son cargadas directamente de la memoria, cuando la aplicación es ejecutada. Por el momento, no existen penalizaciones en el rendimiento. En .NET 5.0, las aplicaciones de un solo archivo se centran principalmente en Linux. Pueden ser dependientes del marco o independientes. Las dependientes de Framework pueden ser muy pequeñas, al confiar en un tiempo de ejecución de .NET instalado globalmente. Las Independientes son más grandes (debido a llevar el tiempo de ejecución), pero no requieren la instalación del tiempo de ejecución de .NET como un paso previo a la instalación.

Puede usar los siguientes comandos para generar aplicaciones de un solo archivo:

Aplicación de un solo archivo dependiente del marco de trabajo

 dotnet publish -r linux-x64 --self-contained false /p:PublishSingleFile=true

Aplicación de un solo archivo independiente con recorte de ensamblado y lista para ejecutarse habilitada:

dotnet publish -r linux-x64 --self-contained true /p:PublishSingleFile=true /p:PublishTrimmed=true /p:PublishReadyToRun=true

También podemos configurar la publicación de un solo archivo con un archivo de proyecto.

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net5.0</TargetFramework>
    <!-- Enable single file -->
    <PublishSingleFile>true</PublishSingleFile>
    <!-- Determine self-contained or framework-dependent -->
    <SelfContained>true</SelfContained>
    <!-- The OS and CPU type you are targeting -->
    <RuntimeIdentifier>linux-x64</RuntimeIdentifier>
    <!-- Enable use of assemby trimming - only supported for self-contained apps -->
    <PublishTrimmed>true</PublishTrimmed>
    <!-- Enable AOT compilation -->
    <PublishReadyToRun>true</PublishReadyToRun>
  </PropertyGroup>

</Project>

Contenedores más pequeños

Se ha vuelto a la idea de basar las imágenes en la imagen del SDK como punto de inicio. Esto ayudó a reducir el tamaño de las imágenes de una manera significativa.

Ubuntu 20.04 Focal

Tirar de imagenAntesDespués
sdk:5.0-focal268 MB232 MB
aspnet:5.0-focal64 MB10 KB (solo manifiesto)

Debian 10 Buster

Tirar de imagenAntesDespués
sdk:5.0280 MB218 MB
aspnet:5.084 MB4 KB (solo manifiesto)

Esto nos da como beneficio que podemos instalar en la imágenes lo que realmente necesitamos. Por ejemplo, si no necesitamos ASP.Net, ahora  no lo tendremos disponible al menos que lo instalemos en la imagen.

ClickOnce Support

Hace unos meses se anunció el soporte ClickOnce para .Net Core. Todavía se sigue trabajando en este proyecto y se espera tenerlo listo en la Release Candidate 2.

Conclusión

Muchísimas mejoras y nuevas características tenemos disponibles hasta la primera release candidate para poder ir probando y estar actualizados apenas este la versión final. En el siguiente post veremos Asp.Net 5 Preview 8.

Referencias

Fernando Sonego

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *