.NET 7 Preview 3

Se ha liberado .NET 7 Preview 3. La tercera vista previa de .NET 7 incluye mejoras en observability, los tiempos de inicio, el codegen, las regiones GC, la compilación nativa de AOT y otros. El SDK esta disponibles para que los tomemos ahora mismo y comencemos a experimentar con nuevas características como:

  • AOT nativo
  • Regiones GC predeterminadas
  • Mejoras en el tiempo de inicio de ASP.NET Core

Podemos descargar .NET 7 Preview 3 para Windows, macOS y Linux.

.NET 7 Preview 3 se ha probado con Visual Studio 17.2 Preview 3. Nos recomiendan usar las compilaciones de canal de vista previa si deseamos probar .NET 7 con productos de la familia Visual Studio. La compatibilidad de Visual Studio para Mac con las versiones preliminares de .NET 7 aún no está disponible, pero llegará pronto. Ahora, entremos en algunas de las últimas actualizaciones de esta versión.

Aplicaciones más rápidas y ligeras con AOT nativo

En la entrada de blog de .NET 7 Preview 2, se anunció que el proyecto AOT nativo se ha movido fuera del estado experimental y se ha trasladado al desarrollo de línea principal en .NET 7 en el repositorio dotnet/runtime. Sabemos que muchos de nosotros hemos estado esperando ansiosamente actualizaciones del equipo sobre lo que viene para Native AOT, y tenemos un par de nuevas actualizaciones para Preview 3.

Si deseamos detalles sobre Native AOT o para saltar y comenzar con él, los documentos de repositorio son el mejor lugar para eso.

¿Qué es native AOT ?

La compilación anticipada (AOT) se refiere a un grupo de tecnologías que generan código en el momento de la compilación de la aplicación, en lugar del tiempo de ejecución. AOT no es nuevo en .NET. Hoy enviamos ReadyToRun para escenarios de cliente y servidor, Mono AOT para dispositivos móviles y WASM. Native AOT trae la compilación previa nativa completa a los escenarios de cliente y servidor de escritorio .NET. Native AOT no está reemplazando estas tecnologías existentes, sino que está ofreciendo un nuevo conjunto de capacidades que desbloquea nuevos factores de forma.

Los ensamblados .NET compilados por AOT existentes contienen estructuras de datos específicas de la plataforma y código nativo para el trabajo de carga frontal que normalmente se realiza en tiempo de ejecución. La precompilación de estos artefactos ahorra tiempo en el inicio (por ejemplo, ReadyToRun) y permite el acceso a plataformas sin JIT (por ejemplo, iOS). Si los artefactos precompilados no están presentes, .NET recurre a JIT o interpretación (dependiendo de la plataforma).

Native AOT es similar a las tecnologías AOT existentes de NET, pero solo produce artefactos nativos. De hecho, el tiempo de ejecución de Native AOT no sabe cómo leer los formatos de archivo de ensamblado .NET, todo es nativo de la plataforma. El análisis del formato de archivo ejecutable es manejado completamente por el sistema operativo subyacente.

La principal ventaja de Native AOT es el tiempo de inicio, el uso de memoria, el acceso a plataformas restringidas (no se permite JIT) y el tamaño más pequeño en el disco. Las aplicaciones comienzan a ejecutarse en el momento en que el sistema operativo se aloja en ellas en la memoria.

Preparar las aplicaciones para native AOT

Para .NET 7 nos dirigimos a las aplicaciones de consola y las bibliotecas nativas como escenario principal para AOT nativo. Los desarrolladores de aplicaciones y los autores de bibliotecas ahora pueden aprovechar la AOT nativa asegurándose de que sus aplicaciones sean recortables. Dado que el recorte es un requisito para la compilación de AOT nativo, preparar sus aplicaciones y bibliotecas ahora para el recorte también les ayudará a prepararse para AOT nativo. Si es autor de bibliotecas .NET, seguir las instrucciones “Recortar bibliotecas” específicamente le ayudará a preparar sus bibliotecas para el recorte y AOT nativo.

Una de las aplicaciones que planeamos enviar en .NET 7 compilada con Native AOT es la herramienta crossgen. Crossgen forma parte del SDK de .NET. Es el compilador CoreCLR AOT el que produce ejecutables ReadyToRun. Crossgen está escrito en C# y actualmente lo enviamos compilado consigo mismo como una aplicación ReadyToRun (¡son tortugas hasta el final!). Ya estamos viendo algunos números muy prometedores en términos de velocidad y tamaño de compilación. Crossgen se beneficia en gran medida de Native AOT porque es un proceso de corta duración y la sobrecarga de inicio domina el tiempo de ejecución general:

EscenarioReadyToRunNativeAOT
Compilar CoreLib4182 ms3512 ms
Compilar HelloWorld185 ms49 ms
ConfiguraciónTamaño
ReadyToRun34,8 MB
NativeAOT17,6 MB

De cara al futuro, la compatibilidad nativa con AOT se mejorará en las próximas versiones de .NET, sin embargo, siempre habrá razones para preferir JIT para muchos escenarios. También agregaremos soporte de primera clase en el SDK de dotnet para publicar proyectos con AOT nativo.

Observability

.NET 7 continúa evolucionando la compatibilidad con la especificación OpenTelemetry nativa de la nube. La vista previa 3 agrega compatibilidad con las actualizaciones de especificaciones #988 y #1708 que hacen que el estado de seguimiento sea mutable para los muestreadores.

//  ActivityListener Sampling callback
    listener.Sample = (ref ActivityCreationOptions<ActivityContext> activityOptions) =>
    {
        activityOptions = activityOptions with { TraceState = "rojo=00f067aa0ba902b7" };
        return ActivitySamplingResult.AllDataAndRecorded;
    };

System.Composition.Hosting

El último Managed Extensibility Framework recibe una ligera actualización para alinearse con las API de la versión anterior. Las nuevas API permiten agregar una única instancia de objeto al contenedor System.Composition.Hosting. Similar a la funcionalidad proporcionada en las interfaces heredadas System.ComponentModel.Composition.Hosting con la API  ComposeExportedValue(CompositionContainer, T)

Propuesta: Inyectar el objeto existente en MEF2

namespace System.Composition.Hosting
{
    public class ContainerConfiguration
    {
        public ContainerConfiguration WithExport<TExport>(TExport exportedInstance);
        public ContainerConfiguration WithExport<TExport>(TExport exportedInstance, 
string contractName = null, IDictionary<string, object> metadata = null);

        public ContainerConfiguration WithExport(Type contractType, object exportedInstance);
        public ContainerConfiguration WithExport(Type contractType, object exportedInstance, 
string contractName = null, IDictionary<string, object> metadata = null);
    }
}

Mejoras en el tiempo de inicio con Write-Xor-Execute habilitado

El rendimiento sigue siendo un enfoque importante para .NET 7. Dotnet/runtime#65738 PR reimplementó los stubs de precodificación y conteo de llamadas (stubs auxiliares de compilación en niveles) para reducir significativamente el número de modificaciones posteriores a la creación del código ejecutable en el tiempo de ejecución. Esto resultó en mejoras del tiempo de inicio del 10-15%.

Como beneficio adicional, este cambio también resultó en mejoras de rendimiento de estado estacionario (hasta un 8%) en algunos microbenchmarks y algunos ASPNet Benchmarks incluso sin Write-Xor-Execute habilitado.

Sin embargo, también hay pocas regresiones resultantes de ese cambio (sin Write-Xor-Execute habilitado) que se abordarán en las próximas versiones preliminares. Estos se observaron en los puntos de referencia de Orchard y Fortunes solo en procesadores Intel.

Proyectos apuntan a .Net 7

Para tener como destino .NET 7, debe usar el alias de .NET 7 Target Framework (TFM) en el archivo de proyecto. Por ejemplo:

<TargetFramework>net7.0</TargetFramework>

A continuación se muestra el conjunto completo de TFM de .NET 7, incluidos los específicos de cada tecnología:

  • net7.0
  • net7.0-android
  • net7.0-ios
  • net7.0-maccatalyst
  • net7.0-macos
  • net7.0-tvos
  • net7.0-windows

Esperamos que la actualización de .NET 6 a .NET 7 sea sencilla ya que se tienen poco break changes.

Soporte

.NET 7 es una versión actual, lo que significa que recibirá soporte y parches gratuitos durante 18 meses a partir de la fecha de lanzamiento. Es importante tener en cuenta que la calidad de todos los lanzamientos es la misma. La única diferencia es la duración del soporte. Para obtener más información sobre las directivas de compatibilidad de .NET, consultemos la directiva de compatibilidad oficial de .NET y .NET Core.

Cambios de ultima hora

Podemos encontrar la lista más reciente de cambios importantes en .NET 7 leyendo el documento Cambios de interrupción en .NET 7. Enumeremos los cambios de ruptura por área y lanzamiento con enlaces a explicaciones detalladas.

Para ver qué cambios de interrupción se proponen pero aún se están revisando, sigamos el problema de GitHub Cambios de interrupción de .NET propuestos.

RoadMap

Las versiones de .NET incluyen productos, bibliotecas, tiempo de ejecución y herramientas, y representan una colaboración entre varios equipos dentro y fuera de Microsoft. Podemos obtener más información sobre estas áreas leyendo las hojas de ruta del producto:

Referencia:

http://Announcing .NET 7 Preview 3 – .NET Blog (microsoft.com)