Este 25 de mayo se lanzó la nueva preview 4 de .Net 6. Esta versión preview 4 establece una base sólida para la versión final de .NET 6 en noviembre de este mismo año, con características y experiencias finales. También está listo para pruebas en el mundo real si aún no ha probado .NET 6 en su entorno.
Se confirma la fecha final de lanzamiento que será del 9 al 11 de noviembre en la .NET Conf 2021. Se lanzara oficialmente.NET 6 el día 9 donde habrán muchas charlas y demos en profundidad con todo lo nuevo que viene en .NET 6.
Si quieres comenzar a probar desde ahora puedes descargar .NET 6 Preview 4 para Linux, macOS y Windows.
- Instaladores y binarios
- Imágenes de contenedores
- Paquetes de Linux
- Notas
- Problemas conocidos
- Rastreador de problemas de GitHub
.NET 6 se ha probado con Visual Studio 16.11 y Visual Studio para Mac 8.9. El equipo usar esas versiones si deseamos probar .NET 6 con Visual Studio.
Build 2021
Esta semana se realizará la conferencia Microsoft Build conference Es gratis y se transmite en la web. Tampoco es necesario registrarse.
Puedes consultar algunas de las charlas que se incluirán sobre .NET 6 y demos que estarán en el evento:
- The future of modern application development with .NET
- .NET 6 deep dive; what’s new and what’s coming
- .NET Team “Ask the Experts”
Unificación de la plataforma .NET
Hemos hablado mucho en publicaciones anteriores y en conferencias sobre la unificación de .NET, pero falta en los temas. La unificación de la plataforma está integrada en todo lo que hacemos y no tiene necesidad de su propio tema. Uno puede pensar que es el único mega-tema por encima y más allá de los que se enumeran. Se intercala a través de múltiples de los temas y es una suposición básica del equipo en el futuro.
El proyecto de rendimiento de bucle interno es un gran ejemplo. Se supone que todas las aplicaciones de .NET 6 comparten la misma base, por ejemplo, con el mismo sistema de compilación y bibliotecas. Cuando hay una diferencia técnica, como el uso de un tiempo de ejecución diferente (CoreCLR o Mono) o una técnica de generación de código (AOT o JIT), tomamos esas cosas en cuenta y ofrecemos experiencias pragmáticas y apropiadas, con un sesgo a ninguna diferencia de experiencia observable. El proyecto EventPipe es otro ejemplo similar.
Confianza en la producción
Pronto comenzaremos a lanzar compilaciones «en vivo» que son compatibles con la producción. Actualmente estamos apuntando a agosto para eso. Nuestro modelo de desarrollo está orientado a permitir cargas de trabajo de producción, incluso mientras estamos terminando de trabajar en todos los temas que acabamos de mencionar.
La confianza en la producción comienza con el sitio de dotnet.microsoft.com. Ha estado ejecutando la mitad de su carga de sitio en .NET 6 a partir de Preview 1. Si bien no es a gran escala, es un sitio de misión crítica para nuestro equipo y lo tomamos muy en serio. .NET 6 ha estado trabajando para nosotros como un campeón.
También trabajamos con equipos de Microsoft que implementan sus aplicaciones de producción en vistas previas de .NET. Lo hacen para poder aprovechar las nuevas características de .NET desde el principio. Estos equipos siempre están buscando oportunidades para reducir sus costos de alojamiento en la nube, y la implementación de nuevas versiones de .NET ha demostrado ser uno de los enfoques más efectivos y de menor esfuerzo para eso. Estos equipos nos dan retroalimentación temprana que nos ayuda a garantizar que las nuevas características estén listas para el uso de producción global. También influyen significativamente en la forma de la característica final porque son nuestros primeros usuarios de producción.
Todas estas primeras pruebas de batalla con aplicaciones del mundo real aumentan nuestra confianza en que .NET 6 estará listo para ejecutar su aplicación.
El resto de la publicación está dedicada a las características que son nuevas en la vista previa 4.
Herramientas: Hot Reload con el depurador de Visual Studio y dotnet CLI
Hot Reload es una nueva experiencia que le permite realizar ediciones en el código fuente de su aplicación mientras se ejecuta sin necesidad de pausar manualmente la aplicación o alcanzar un punto de interrupción. Esta herramienta mejora la productividad del desarrollador al reducir el número de veces que necesita reiniciar la aplicación en ejecución.
Con esta versión, Hot Reload funciona para muchos tipos de aplicaciones, como WPF, Windows Forms, WinUI, ASP.NET, aplicaciones de consola y otros marcos que se ejecutan sobre el tiempo de ejecución de CoreCLR. También están trabajando para llevar esta tecnología a las aplicaciones WebAssembly, iOS y Android que se ejecutan sobre Mono, pero esto todavía está un poco verde.
Para probar esta característica, debemos tener instalado Visual Studio 2019 versión 16.11 Preview 1 e iniciar la aplicación con el depurador de Visual Studio (F5). Una vez que la aplicación se esté ejecutando, ahora tendremos la nueva opción de realizar cambios en el código y aplicarlos con el nuevo botón «aplicar cambios de código» como se ve a continuación.
Hot Reload también está disponible a través de la herramienta dotnet watch.
Para más información puede leer ad, puede leer Introducing .NET Hot Reload.
Compatibilidad con System.Text.Json para IAsyncEnumerable
IAsyncEnumerable<T> es una característica importante que vino con .NET Core 3.0 y C# 8. Las nuevas mejoras permiten la (des)serialización con objetos System.Text.JsonIAsyncEnumerable<T>
En los ejemplos siguientes podemos ver secuencias como representación de cualquier origen de datos asincrónico. El origen podría ser archivos en un equipo local o resultados de una consulta de base de datos o una llamada a la API de servicio web.
Serialización en streaming
System.Text.Json ahora admite la serialización de valores como matrices JSON, como puede ver en el siguiente ejemplo.IAsyncEnumerable<T>.
using System; using System.Collections.Generic; using System.IO; using System.Text.Json; static async IAsyncEnumerable<int> PrintNumbers(int n) { for (int i = 0; i < n; i++) yield return i; } using Stream stream = Console.OpenStandardOutput(); var data = new { Data = PrintNumbers(3) }; await JsonSerializer.SerializeAsync(stream, data); // prints {"Data":[0,1,2]}
IAsyncEnumerable los valores solo se admiten mediante los métodos de serialización asincrónica. si Intentamos serializar usando los métodos sincrónicos resultará en una llamada NotSupportedException
Deserialización de streaming
La deserialización por streaming requería una nueva API que devolviera . Se agrego el método para este propósito, como puede ver en el siguiente ejemplo.IAsyncEnumerable<T>JsonSerializer.DeserializeAsyncEnumerable.
using System; using System.IO; using System.Text; using System.Text.Json; var stream = new MemoryStream(Encoding.UTF8.GetBytes("[0,1,2,3,4]")); await foreach (int item in JsonSerializer.DeserializeAsyncEnumerable<int>(stream)) { Console.WriteLine(item); }
En el ejemplo, se deserializar elementos bajo demanda y puede ser útil cuando se consumen flujos de datos particularmente grandes. Solo admite la lectura de matrices JSON a nivel de raíz, pero esto podría mejorarse en el futuro.
El método existente está soportado nominalmente , pero dentro de los límites de su firma de método no streaming. Debe devolver el resultado final como un único valor, como se puede ver en el siguiente ejemplo DeserializeAsyncIAsyncEnumerable<T>.
using System; using System.Collections.Generic; using System.IO; using System.Text; using System.Text.Json; var stream = new MemoryStream(Encoding.UTF8.GetBytes(@"{""Data"":[0,1,2,3,4]}")); var result = await JsonSerializer.DeserializeAsync<MyPoco>(stream); await foreach (int item in result.Data) { Console.WriteLine(item); } public class MyPoco { public IAsyncEnumerable<int> Data { get; set; } }
En este ejemplo, el deserializadohabrá almacenado en búfer todo el contenido de la memoria antes de devolver el objeto deserializado. Esto se debe a que el deserializador debe haber consumido todo el valor JSON antes de devolver un resultado IAsyncEnumerable.
System.Text.Json: Función DOM grabable
La característica JSON DOM grabable agrega un nuevo modelo de programación sencillo y de alto rendimiento para esta nueva API. Evita la complejidad y los pasos de serialización y el costo tradicional de un DOM con System.Text.Json.
- Una alternativa ligera a la serialización para los casos en que el uso de tipos POCO no es posible o deseado, o cuando un esquema JSON no está fijo y debe ser inspeccionado.
- Permite la modificación eficiente de un subconjunto de un árbol grande. Por ejemplo, es posible navegar de manera eficiente a una subsección de un árbol JSON grande y leer una matriz o deserializar un POCO de esa subsección. LINQ también se puede usar con eso.
- Habilita el uso de la palabra clave C#, que permite un modelo de tipo flexible y más parecido a un script.dynamic
API DOM grabables Tipos:
namespace System.Text.Json.Node { public abstract class JsonNode {...}; public sealed class JsonObject : JsonNode, IDictionary<string, JsonNode?> {...} public sealed class JsonArray : JsonNode, IList<JsonNode?> {...}; public abstract class JsonValue : JsonNode {...}; }
Código de ejemplo
En el ejemplo siguiente se muestra el nuevo modelo de programación.
// Parse a JSON object JsonNode jNode = JsonNode.Parse("{"MyProperty":42}"); int value = (int)jNode["MyProperty"]; Debug.Assert(value == 42); // or value = jNode["MyProperty"].GetValue<int>(); Debug.Assert(value == 42); // Parse a JSON array jNode = JsonNode.Parse("[10,11,12]"); value = (int)jNode[1]; Debug.Assert(value == 11); // or value = jNode[1].GetValue<int>(); Debug.Assert(value == 11); // Create a new JsonObject using object initializers and array params var jObject = new JsonObject { ["MyChildObject"] = new JsonObject { ["MyProperty"] = "Hello", ["MyArray"] = new JsonArray(10, 11, 12) } }; // Obtain the JSON from the new JsonObject string json = jObject.ToJsonString(); Console.WriteLine(json); // {"MyChildObject":{"MyProperty":"Hello","MyArray":[10,11,12]}} // Indexers for property names and array elements are supported and can be chained Debug.Assert(jObject["MyChildObject"]["MyArray"][1].GetValue<int>() == 11);
Mejoras de System.Linq
Se han agregado nuevas funcionalidades a la API de System.LINQ solicitadas y aportadas por la comunidad.
Compatibilidad enumerable y parámetros IndexRange
El método ahora acepta índices del final del enumerable, como puede ver en el ejemplo siguiente.Enumerable.ElementAt.
Enumerable.Range(1, 10).ElementAt(^2); // returns 9
Se añadió una sobrecarga que acepta diferentes parámetros. Simplifica la toma de segmentos de secuencias enumerables:Enumerable.TakeRange
- source.Take(..3) en lugar de source.Take(3)
- source.Take(3..) en lugar de source.Skip(3)
- source.Take(2..7) en lugar de source.Take(7).Skip(2)
- source.Take(^3..) en lugar de source.TakeLast(3)
- source.Take(..^3) en lugar de source.SkipLast(3)
- source.Take(^7..^3) en lugar de.source.TakeLast(7).SkipLast(3)
TryGetNonEnumeratedCount
El método intenta obtener el recuento del origen enumerable sin forzar una enumeración. Este enfoque puede ser útil en escenarios en los que es útil preasignar búferes antes de la enumeración, como puede ver en el ejemplo siguiente.TryGetNonEnumeratedCount.
List<T> buffer = source.TryGetNonEnumeratedCount(out int count) ? new List<T>(capacity: count) : new List<T>(); foreach (T item in source) { buffer.Add(item); }
TryGetNonEnumeratedCount comprueba las fuentes que implementan / o aprovecha algunas de las optimizaciones internas empleadas por Linq ICollectionICollection<T>
DistinctBy/UnionBy/IntersectBy/ExceptBy
Se han añadido nuevas variantes a las operaciones de conjunto que permiten especificar la igualdad mediante funciones de selector de teclas, como se puede ver en el siguiente ejemplo.
Enumerable.Range(1, 20).DistinctBy(x => x % 3); // {1, 2, 3} var first = new (string Name, int Age)[] { ("Francis", 20), ("Lindsey", 30), ("Ashley", 40) }; var second = new (string Name, int Age)[] { ("Claire", 30), ("Pat", 30), ("Drew", 33) }; first.UnionBy(second, person => person.Age); // { ("Francis", 20), ("Lindsey", 30), ("Ashley", 40), ("Drew", 33) }
MaxBy/MinBy
MaxBy y los métodos permiten encontrar elementos máximos o mínimos mediante un selector de claves, como se puede ver en el siguiente ejemplo.
MinBy
var people = new (string Name, int Age)[] { ("Francis", 20), ("Lindsey", 30), ("Ashley", 40) };people.MaxBy(person => person.Age); // ("Ashley", 40)
Chunk
Chunk se puede utilizar para fragmentar un origen enumerable en sectores de un tamaño fijo, como se puede ver en el siguiente ejemplo.
IEnumerable<int[]> chunks = Enumerable.Range(0, 10).Chunk(size: 3); // { {0,1,2}, {3,4,5}, {6,7,8}, {9} }
FirstOrDefault/LastOrDefault/SingleOrDefault sobrecargas tomando parámetros predeterminados
Los métodos existentes devuelven si el origen enumerable está vacío. Se han añadido nuevas sobrecargas que aceptan un parámetro predeterminado para ser devuelto en ese caso, como se puede ver en el siguiente ejemplo.FirstOrDefaultLastOrDefaultSingleOrDefaultdefault(T)
Enumerable.Empty<int>().SingleOrDefault(-1); // returns -1
Zip sobrecarga aceptando tres enumerables
El método Zip ahora admite la combinación de tres enumerables, como puede ver en el siguiente ejemplo.
var xs = Enumerable.Range(1, 10); var ys = xs.Select(x => x.ToString()); var zs = xs.Select(x => x % 2 == 0); foreach ((int x, string y, bool z) in Enumerable.Zip(xs,ys,zs)) { }
Rendimiento de FileStream significativamente mejorado en Windows
FileStream se ha reescrito en .NET 6, para tener un rendimiento y una fiabilidad mucho mayores en Windows.
El proyecto de reescritura se ha escalonado en cinco puntos Puedes consultar los siguientes links para más detalle:
- Introducción a FileStreamStrategy como primer paso de la reescritura de FileStream
- FileStream reescribir parte II
- Optimizaciones de FileStream
- Reescritura de FileStream: usar IValueTaskSource en lugar de TaskCompletionSource
- Reescritura de FileStream: almacenamiento en caché de ValueTaskSource en AsyncWindowsFileStreamStrategy
Configuración
El primer PR permite elegir una implementación en tiempo de ejecución. La ventaja más obvia de este patrón es habilitar el cambio a la antigua implementación de .NET 5, lo que puede hacer con la siguiente configuración, en .FileStreamruntimeconfig.json
{ "configProperties": { "System.IO.UseNet5CompatFileStream": true } }
Se planea agregar una estrategia de io_uring a continuación, que aproveche una característica de Linux con el mismo nombre en kernels más modernos.
Punto de referencia de rendimiento
Veamos las mejoras usando BenchmarkDotNet.
public class FileStreamPerf { private const int FileSize = 1_000_000; // 1 MB private Memory<byte> _buffer = new byte[8_000]; // 8 kB [GlobalSetup(Target = nameof(ReadAsync))] public void SetupRead() => File.WriteAllBytes("file.txt", new byte[FileSize]); [Benchmark] public async ValueTask ReadAsync() { using FileStream fileStream = new FileStream("file.txt", FileMode.Open, FileAccess.Read, FileShare.Read, bufferSize: 4096, useAsync: true); while (await fileStream.ReadAsync(_buffer) > 0) { } } [Benchmark] public async ValueTask WriteAsync() { using FileStream fileStream = new FileStream("file.txt", FileMode.Create, FileAccess.Write, FileShare.Read, bufferSize: 4096, useAsync: true); for (int i = 0; i < FileSize / _buffer.Length; i++) { await fileStream.WriteAsync(_buffer); } } [GlobalCleanup] public void Cleanup() => File.Delete("file.txt"); }
Resultados:
- La lectura de 1 archivo MB es ahora 2 veces más rápida, mientras que la escritura es 4 veces más rápida.
- ¡Las asignaciones de memoria se redujeron de 39 kilobytes a 1 kilobyte! ¡Esta es una mejora del 97.5%!
Estos cambios deberían proporcionar una mejora dramática para los usuarios de Windows.
Soporte mejorado de fecha, hora y zona horaria
Se han realizado las siguientes mejoras en los tipos relacionados con la fecha y la hora.
Nuevo y estructuras DateOnlyTimeOnly
Se han añadido estructuras de solo fecha y hora, con las siguientes características:
- Cada uno representa la mitad de un , ya sea solo la parte de fecha o solo la parte de tiempo.DateTime
- DateOnly es ideal para cumpleaños, días de aniversario y días hábiles. Se alinea con el tipo de SQL Server.date
- TimeOnly es ideal para reuniones recurrentes, despertadores y horarios comerciales semanales. Se alinea con el tipo de SQL Server.time
- Complementa los tipos de fecha/hora existentes (, , , ).DateTimeDateTimeOffsetTimeSpanTimeZoneInfo
- En el espacio de nombres, se envía en CoreLib, al igual que los tipos relacionados existentes.System
Mejoras de Perf a DateTime.UtcNow
Esta mejora tiene los siguientes beneficios:
- Corrige la regresión perf 2.5x para obtener el tiempo del sistema en Windows.
- Utiliza una caché deslizante de 5 minutos de datos de segundos saltos de Windows en lugar de buscarlos con cada llamada.
Compatibilidad con zonas horarias de Windows e IANA en todas las plataformas
Esta mejora tiene los siguientes beneficios:
- Conversión implícita al usar (https://github.com/dotnet/runtime/pull/49412)TimeZoneInfo.FindSystemTimeZoneById
- Conversión explícita a través de nuevas API en: , , y (https://github.com/dotnet/runtime/issues/49407)TimeZoneInfoTryConvertIanaIdToWindowsIdTryConvertWindowsIdToIanaIdHasIanaId
- Mejora la compatibilidad entre plataformas y la interoperabilidad entre sistemas que utilizan diferentes tipos de zonas horarias.
- Elimina la necesidad de usar la biblioteca OSS TimeZoneConverter. La funcionalidad ahora está incorporada.
Nombres para mostrar de zona horaria mejorados
Esta mejora tiene los siguientes beneficios:
- Quita la ambigüedad de los nombres para mostrar de la lista devuelta por .TimeZoneInfo.GetSystemTimeZones
- Aprovecha los datos de globalización de ICU / CLDR.
- Unix solo por ahora. Windows todavía usa los datos del Registro. Esto se puede cambiar más adelante.
Otro
- El nombre para mostrar y el nombre estándar de la zona horaria UTC estaban codificados al inglés y ahora usan el mismo idioma que el resto de los datos de la zona horaria (en Unix, idioma predeterminado del sistema operativo en Windows).CurrentUICulture
- Los nombres para mostrar de zona horaria en WASM utilizan el ID IANA no localizado en su lugar, debido a limitaciones de tamaño.
- TimeZoneInfo.AdjustmentRule la clase anidada hace pública su propiedad interna y obtiene un nuevo constructor que toma como parámetro. (https://github.com/dotnet/runtime/issues/50256)BaseUtcOffsetDeltabaseUtcOffsetDelta
- TimeZoneInfo.AdjustmentRule También obtiene varias correcciones para cargar zonas horarias en Unix (https://github.com/dotnet/runtime/pull/49733), (https://github.com/dotnet/runtime/pull/50131)
CodeGen
Se han realizado las siguientes mejoras en el compilador RyuJIT. puecen verlo en cada uno de los issue reportados:
Contribuciones comunitarias
@SingleAccretion ha estado ocupado haciendo las siguientes mejoras en los últimos meses. Eso es además de una contribución en .NET 6 Preview 3. ¡Gracias!
- dotnet/runtime #50373 — No doble negación si el árbol es candidato a CSE
- dotnet/runtime #50450 — Maneje las fundiciones realizadas a través de ayudantes y las operaciones de desbordamiento de pliegues en la numeración de valores
- dotnet/runtime #50702 — Eliminar el requisito de debe iniciarse para las cookies GS
- dotnet/runtime #50703 — No confunda fgDispBasicBlocks en fgMorphBlocks
PGO dinámico
Se han realizado las siguientes mejoras para admitir el PGO dinámico.
- dotnet/runtime #51664 — Actualice JIT para consumir los nuevos registros «LikelyClass» vistos a partir de datos PGO procesados por crossgen
- dotnet/runtime #50213 — Tolera mejor las inconsistencias del perfil de borde
- dotnet/runtime #50633 — correcciones para compilaciones mixtas PGO/noPGO
- dotnet/runtime #50765 — Revise fgExpandRunRarelyBlocks
- dotnet/runtime #51593 — Revisar los cálculos de escala en línea
Optimizaciones de bucle JIT
Se han realizado las siguientes mejoras para las optimizaciones de bucle.
- dotnet/runtime #50982 — Generalizar la inversión de bucle
- dotnet/runtime #51757 — No volver a calcular las listas de preds durante la clonación de bucles
LSRA
Se han realizado las siguientes mejoras en la asignación de registros de escaneo lineal (LRSA).
- dotnet/runtime #51281 — Mejore las estadísticas de LRSA para incluir información heurística de selección de registros
Optimizaciones
- dotnet/runtime #49930 — Fold null checks for const strings at the Value Numbering level
- dotnet/runtime #50000 — Doblar comprobaciones nulas contra campos de solo lectura estáticos inicializados de tipos de referencia
- dotnet/runtime #50112 — No asigne literales de cadena dentro de posibles candidatos BBJ_THROW
- dotnet/runtime #50644 — Habilitar CSE para VectorX.Create
- dotnet/runtime #50806 — Renuncia a la llamada de cola si hay bloques inesperados después de ella
- dotnet/runtime #50832 — Actualización a soporte y nuintVector<T>nint
- dotnet/runtime #51409 — Generalice la rama en torno a la optimización del flujo vacío
Diagnóstico de .NET: EventPipe para Mono y rendimiento mejorado de EventPipe
EventPipe es el mecanismo multiplataforma de NET para la salida de eventos, datos de rendimiento y contadores. A partir de .NET 6, se ha movido movido la implementación de C++ a C. ¡Con este cambio, Mono también podrá usar EventPipe! Esto significa que tanto CoreCLR como Mono usarán la misma infraestructura de eventos, incluidas las herramientas de la CLI de .NET Diagnostics. Este cambio también vino con una pequeña reducción en el tamaño de CoreCLR:
También hemos realizado algunos cambios que mejoran el rendimiento de EventPipe mientras está bajo carga. Durante las primeras vistas previas, hemos realizado una serie de cambios que dan como resultado mejoras de rendimiento tan altas como 2.06 veces lo que .NET 5 era capaz de hacer:
Publicación de un solo archivo
Se han realizado las siguientes mejoras para la publicación de aplicaciones de un solo archivo.
Análisis estático
Se agregaron analizadores para la publicación de un solo archivo en .NET 5 para advertir sobre y algunas otras API que se comportan de manera diferente en paquetes de un solo archivo Assembly.Location.
En.NET 6 Preview 4, se ha mejorado el análisis para permitir advertencias personalizadas. Si tiene una API que no funciona en la publicación de un solo archivo, ahora podemos
marcarla con el atributo [RequiresAssemblyFiles] y aparecerá una advertencia si el analizador está habilitado.
Agregar este atributo también silenciará todas las advertencias relacionadas con un solo archivo en el método, por lo que puede usar la advertencia para propagar las advertencias hacia arriba a su API pública
El analizador se habilitara automáticamente para proyectos exe cuando se establece n PublishSingleFile en true, pero también puede habilitarlo para cualquier proyecto estableciendo EnableSingleFileAnalysis en true . Esto podría ser útil si desea incrustar una biblioteca en un solo paquete de archivos
Compresión
Los paquetes de un solo archivo ahora admiten la compresión, que se puede habilitar estableciendo la propiedad EnableCompressionInSingleFile en true. En tiempo de ejecución, los archivos se descomprimen en la memoria según sea necesario. La compresión puede proporcionar un gran ahorro de espacio para algunos escenarios.
Veamos la publicación de un solo archivo, con y sin compresión, utilizada con NuGet Package Explorer.
Con compresión: 71.6 MB
La compresión puede aumentar significativamente el tiempo de inicio de la aplicación, especialmente en plataformas Unix (porque tienen una ruta de inicio rápido sin copia que no se puede usar con compresión). Debemos probar tu aplicación después de habilitar la compresión para ver si el costo de inicio adicional es aceptable.
PublishReadyToRun ahora utiliza crossgen2 de forma predeterminada
Crossgen2 ahora está habilitado de forma predeterminada al publicar imágenes ReadyToRun. También admite opcionalmente la generación de imágenes compuestas.
La siguiente configuración se expone para permitirle configurar la publicación con código listo para ejecutar. La configuración se establece en sus valores predeterminados.
<PublishReadyToRun>false</PublishReadyToRun> <!-- set to true to enable publishing with ready to run native code --> <PublishReadyToRunUseCrossgen2>true</PublishReadyToRunUseCrossgen2> <!-- set to false to use crossgen like in 5.0 --> <PublishReadyToRunComposite>false</PublishReadyToRunComposite> <!-- set to true to generate a composite R2R image -->
Instalación de la CLI de cargas de trabajo opcionales del SDK de .NET 6
.NET 6 introducirá el concepto de cargas de trabajo del SDK que se pueden instalar después del hecho en la parte superior del SDK de .NET para habilitar varios escenarios. Las nuevas cargas de trabajo disponibles en la vista previa 4 son cargas de trabajo AOT de .NET MAUI y Blazor WebAssembly.
Para las cargas de trabajo MAUI de .NET, se recomienda seguir utilizando la herramienta maui-check para la vista previa 4, ya que incluye componentes adicionales que aún no están disponibles en Visual Studio o como una carga de trabajo del SDK de .NET. Para probar la experiencia del SDK de .NET de todos modos (usando iOS como ejemplo). Una vez instalado, puede ejecutar y luego crear y compilar su proyecto.dotnet workload install microsoft-ios-sdk-fulldotnet new iosdotnet build
Para Blazor WebAssembly AOT, siga las instrucciones de instalación proporcionadas a través del blog de ASP.NET.
Preview 4 incluye cargas de trabajo MAUI de .NET para iOS, Android, tvOS, MacOS y MacCatalyst.
Tengamos en cuenta que copia las cargas de trabajo de NuGet.org en la instalación del SDK, por lo que deberá ejecutarse con privilegios elevados/sudo si la ubicación de instalación del SDK está protegida (es decir, en una ubicación admin/root).dotnet workload install
Comprobación de versiones del SDK integrada
Para facilitar el seguimiento de cuándo están disponibles nuevas versiones del SDK y los tiempos de ejecución, se ha agregado un nuevo comando al SDK de .NET 6: dotnet sdk check
Esto nos indicará dentro de cada banda de características cuál es la última versión disponible de .NET SDK y .NET Runtime.
CLI Templates (dotnet new)
La vista previa 4 presenta una nueva capacidad de búsqueda para plantillas. buscará NuGet.org plantillas coincidentes. Durante las próximas vistas previas, los datos utilizados para esta búsqueda se actualizarán con más frecuencia con.dotnet new –search.
Las plantillas instaladas están disponibles tanto para la CLI como para Visual Studio. Se resolvió un problema anterior con las plantillas instaladas por el usuario que se perdían cuando se instalaba una nueva versión del SDK, sin embargo, las plantillas instaladas antes de .NET 6 Preview 4 deberán reinstalarse.
Una vez instaladas las plantillas de la CLI, puede comprobar si las actualizaciones están disponibles a través de y . Esto ahora reflejará las actualizaciones de plantillas mucho más rápidamente, admitirá las fuentes de NuGet que haya definido y admitirá las credenciales de autorización.–update-check–update-apply–interactive
En la vista previa 4 y las próximas vistas previas, la salida de los comandos se limpiará para centrarse en la información que más necesita. Por ejemplo, enumera solo las plantillas que acaban de instalar, en lugar de todas las plantillas.dotnet newdotnet new –install <package>
Para admitir estos y los próximos cambios en , estamos realizando cambios significativos en la API del motor de plantillas que pueden afectar a cualquier persona que hospede el motor de plantillas. Estos cambios aparecerán en La vista previa 4 y la vista previa 5. Si está alojando el motor de plantillas, comuníquese con nosotros en https://github.com/dotnet/templating para que podamos trabajar con usted para evitar o minimizar las interrupciones.dotnet new
Conclusiones
El equipo comenta que ya estamos parados sobre la versión de .NET 6. El lanzamiento final será en noviembre, aunque aún falta bastante tiempo, se están acercando a terminar el desarrollo de características.