Novedades de .NET Core 2.1What's new in .NET Core 2.1

.NET Core 2.1 incluye mejoras y características nuevas en las áreas siguientes:.NET Core 2.1 includes enhancements and new features in the following areas:

ToolingTooling

El SDK de .NET Core 2.1 (v 2.1.300), el conjunto de herramientas incluidas con .NET Core 2.1, incluye los siguientes cambios y mejoras:The .NET Core 2.1 SDK (v 2.1.300), the tooling included with .NET Core 2.1, includes the following changes and enhancements:

Mejoras en el rendimiento de la compilaciónBuild performance improvements

Un aspecto fundamental de .NET Core 2.1 es mejorar el rendimiento del tiempo de compilación, especialmente para compilaciones incrementales.A major focus of .NET Core 2.1 is improving build-time performance, particularly for incremental builds. Estas mejoras de rendimiento se aplican a las compilaciones de línea de comandos mediante dotnet build y a las compilaciones de Visual Studio.These performance improvements apply to both command-line builds using dotnet build and to builds in Visual Studio. Algunas áreas individuales de mejora incluyen:Some individual areas of improvement include:

  • Para la resolución de activos del paquete, solo se resuelven los activos utilizados por una compilación en lugar de todos los activos.For package asset resolution, resolving only assets used by a build rather than all assets.

  • Almacenamiento en caché de referencias de ensamblado.Caching of assembly references.

  • Uso de servidores de compilación de SDK de larga ejecución, que son procesos que se extienden a través de invocaciones dotnet build individuales.Use of long-running SDK build servers, which are processes that span across individual dotnet build invocations. Eliminan la necesidad de compilar mediante JIT grandes bloques de código cada vez que se ejecuta dotnet build.They eliminate the need to JIT-compile large blocks of code every time dotnet build is run. Los procesos del servidor de compilación se pueden terminar automáticamente con el siguiente comando:Build server processes can be automatically terminated with the following command:

    dotnet buildserver shutdown
    

Nuevos comandos de la CLINew CLI commands

Una serie de herramientas que estaban disponibles solo en función del proyecto mediante DotnetCliToolReference ahora están disponibles como parte del SDK de .NET Core.A number of tools that were available only on a per project basis using DotnetCliToolReference are now available as part of the .NET Core SDK. Estas herramientas incluyen:These tools include:

  • dotnet watch proporciona un monitor del sistema de archivos que espera que un archivo cambie antes de ejecutar un conjunto designado de comandos.dotnet watch provides a file system watcher that waits for a file to change before executing a designated set of commands. Por ejemplo, el siguiente comando vuelve a generar automáticamente el proyecto actual y genera un resultado detallado cada vez que cambie un archivo en él:For example, the following command automatically rebuilds the current project and generates verbose output whenever a file in it changes:

    dotnet watch -- --verbose build
    

    Tenga en cuenta que la opción -- precede a la opción --verbose.Note the -- option that precedes the --verbose option. Delimita las opciones pasadas directamente al comando dotnet watch de los argumentos que se pasan al proceso dotnet secundario.It delimits the options passed directly to the dotnet watch command from the arguments that are passed to the child dotnet process. Sin él, la opción --verbose se aplica al comando dotnet watch, no al comando dotnet build.Without it, the --verbose option applies to the dotnet watch command, not the dotnet build command.

    Para obtener más información, consulte Desarrollar aplicaciones ASP.NET Core con dotnet watch.For more information, see Develop ASP.NET Core apps using dotnet watch

  • dotnet dev-certs genera y administra los certificados que se usan durante el desarrollo de aplicaciones de ASP.NET Core.dotnet dev-certs generates and manages certificates used during development in ASP.NET Core applications.

  • dotnet user-secrets administra los secretos en un almacén de secretos de usuario en aplicaciones de ASP.NET Core.dotnet user-secrets manages the secrets in a user secret store in ASP.NET Core applications.

  • dotnet sql-cache crea una tabla e índices en una base de datos de Microsoft SQL Server que se usará para el almacenamiento en caché distribuido.dotnet sql-cache creates a table and indexes in a Microsoft SQL Server database to be used for distributed caching.

  • dotnet ef es una herramienta para administrar bases de datos, objetos DbContext y migraciones en las aplicaciones de Entity Framework Core.dotnet ef is a tool for managing databases, DbContext objects, and migrations in Entity Framework Core applications. Para obtener más información, vea EF Core .NET Command-line Tools (Herramienta de la línea de comandos de .NET de EF Core).For more information, see EF Core .NET Command-line Tools.

Herramientas globalesGlobal Tools

.NET core 2.1 es compatible con Herramientas globales: es decir, las herramientas personalizadas que están disponibles globalmente desde la línea de comandos..NET Core 2.1 supports Global Tools -- that is, custom tools that are available globally from the command line. El modelo de extensibilidad en versiones previas de .NET Core permitió que las herramientas personalizadas estuvieran disponibles para cada proyecto solo utilizando DotnetCliToolReference.The extensibility model in previous versions of .NET Core made custom tools available on a per project basis only by using DotnetCliToolReference.

Para instalar una herramienta global, use el comando dotnet tool install.To install a Global Tool, you use the dotnet tool install command. Por ejemplo:For example:

dotnet tool install -g dotnetsay

Una vez instalada, la herramienta se puede ejecutar desde la línea de comandos especificando el nombre de la herramienta.Once installed, the tool can be run from the command line by specifying the tool name. Para más información, vea Información general sobre las herramientas globales de .NET Core.For more information, see .NET Core Global Tools overview.

Administración de herramientas con el comando dotnet toolTool management with the dotnet tool command

En el SDK de .NET Core 2.1 (v. 2.1.300), todas las operaciones de herramientas utilizan el comando dotnet tool.In .NET Core SDK 2.1 (v 2.1.300), all tools operations use the dotnet tool command. Están disponibles las siguientes opciones:The following options are available:

Puesta al díaRoll forward

Todas las aplicaciones de .NET Core a partir de .NET Core 2.0 se ponen al día automáticamente a la versión secundaria más reciente instalada en un sistema.All .NET Core applications starting with the .NET Core 2.0 automatically roll forward to the latest minor version installed on a system.

A partir de .NET Core 2.0, si la versión de .NET Core que se creó una aplicación no está presente en tiempo de ejecución, la aplicación se ejecuta automáticamente en la versión secundaria instalada más reciente de .NET Core.Starting with .NET Core 2.0, if the version of .NET Core that an application was built with is not present at runtime, the application automatically runs against the latest installed minor version of .NET Core. En otras palabras, si una aplicación se compila con .NET Core 2.0, y .NET Core 2.0 no está presente en el sistema host pero sí lo está .NET Core 2.1, la aplicación se ejecuta con .NET Core 2.1.In other words, if an application is built with .NET Core 2.0, and .NET Core 2.0 is not present on the host system but .NET Core 2.1 is, the application runs with .NET Core 2.1.

Importante

Este comportamiento de puesta al día no se aplica para versiones preliminares.This roll-forward behavior doesn't apply to preview releases. Tampoco se aplica a las versiones principales.Nor does it apply to major releases. Por ejemplo, una aplicación .NET Core 1.0 no se actualizaría a .NET Core 2.0 o .NET Core 2.1.For example, a .NET Core 1.0 application wouldn't roll forward to .NET Core 2.0 or .NET Core 2.1.

También puede deshabilitarla la puesta al día de versiones secundarias de cualquiera de estas tres formas:You can also disable minor version roll forward in any of three ways:

  • Establezca la variable de entorno DOTNET_ROLL_FORWARD_ON_NO_CANDIDATE_FX en 0.Set the DOTNET_ROLL_FORWARD_ON_NO_CANDIDATE_FX environment variable to 0.

  • Agregue la siguiente línea al archivo runtimeconfig.json:Add the following line to the runtimeconfig.json file:

    "rollForwardOnNoCandidateFx" : 0
    
  • Cuando use herramientas de la CLI de .NET Core, incluya la siguiente opción con un comando de .NET Core, como run:When using .NET Core CLI tools, include the following option with a .NET Core command such as run:

    dotnet run --rollForwardOnNoCandidateFx=0
    

ImplementaciónDeployment

Mantenimiento de aplicaciones independientesSelf-contained application servicing

dotnet publish ahora publica aplicaciones independientes con una versión en tiempo de ejecución con mantenimiento.dotnet publish now publishes self-contained applications with a serviced runtime version. Cuando publica una aplicación independiente con el SDK 2.1 de .NET Core (v. 2.1.300), su aplicación incluye la última versión de tiempo de ejecución con mantenimiento conocida por ese SDK.When you publish a self-contained application with the .NET Core 2.1 SDK (v 2.1.300), your application includes the latest serviced runtime version known by that SDK. Cuando actualice a la versión más reciente del SDK, publicará con la versión más reciente del tiempo de ejecución de .NET Core.When you upgrade to the latest SDK, you’ll publish with the latest .NET Core runtime version. Esto se aplica para tiempos de ejecución de .NET Core 1.0 y versiones posteriores.This applies for .NET Core 1.0 runtimes and later.

La publicación independiente se basa en las versiones del tiempo de ejecución en NuGet.org. No necesita tener el tiempo de ejecución con mantenimiento en su máquina.Self-contained publishing relies on runtime versions on NuGet.org. You do not need to have the serviced runtime on your machine.

Con el SDK de .NET Core 2.0, las aplicaciones independientes se publican con el tiempo de ejecución de .NET Core 2.0.0 a menos que se especifique una versión diferente a través de la propiedad RuntimeFrameworkVersion.Using the .NET Core 2.0 SDK, self-contained applications are published with the .NET Core 2.0.0 runtime unless a different version is specified via the RuntimeFrameworkVersion property. Con este nuevo comportamiento, ya no será necesario configurar esta propiedad para seleccionar una versión de tiempo de ejecución más alta para una aplicación independiente.With this new behavior, you’ll no longer need to set this property to select a higher runtime version for a self-contained application. El enfoque más sencillo a partir de ahora es publicar siempre con el SDK de .NET Core 2.1 (v. 2.1.300).The easiest approach going forward is to always publish with .NET Core 2.1 SDK (v 2.1.300).

Para obtener más información, vea Self-contained deployment runtime roll forward (Puesta al día de runtimes de implementación independientes).For more information, see Self-contained deploymnet runtime roll forward.

Paquete de compatibilidad de WindowsWindows Compatibility Pack

Al trasladar el código existente de .NET Framework a .NET Core, puede usar el paquete de compatibilidad de Windows.When you port existing code from the .NET Framework to .NET Core, you can use the Windows Compatibility Pack. Esto proporciona acceso a 20 000 API más de las que están disponibles en .NET Core.It provides access to 20,000 more APIs than are available in .NET Core. Estas API incluyen tipos en el espacio de nombres System.Drawing, la clase EventLog, WMI, contadores de rendimiento, servicios de Windows y los tipos y miembros de Registro de Windows.These APIs include types in the System.Drawing namespace, the EventLog class, WMI, Performance Counters, Windows Services, and the Windows registry types and members.

Mejoras del compilador JITJIT compiler improvements

.NET Core incorpora una nueva tecnología de compilador JIT denominada compilación por niveles (también conocida como optimización adaptable) que puede mejorar significativamente el rendimiento..NET Core incorporates a new JIT compiler technology called tiered compilation (also known as adaptive optimization) that can significantly improve performance. La compilación por niveles es una configuración opcional.Tiered compilation is an opt-in setting.

Una de las tareas importantes realizadas por el compilador JIT es optimizar la ejecución de código.One of the important tasks performed by the JIT compiler is optimizing code execution. Sin embargo, para las rutas de código poco utilizadas, el compilador puede dedicar más tiempo a la optimización del código del que dedica el tiempo de ejecución a ejecutar el código no optimizado.For little-used code paths, however, the compiler may spend more time optimizing code than the runtime spends running unoptimized code. La compilación por niveles incluye dos fases en la compilación JIT:Tiered compilation introduces two stages in JIT compilation:

  • Un primer nivel, que genera código tan pronto como sea posible.A first tier, which generates code as quickly as possible.

  • Un segundo nivel, que genera código optimizado para los métodos que se ejecutan con frecuencia.A second tier, which generates optimized code for those methods that are executed frequently. El segundo nivel de la compilación se realiza en paralelo para mejorar el rendimiento.The second tier of compilation is performed in parallel for enhanced performance.

Puede participar en la compilación en niveles de cualquiera de estas dos maneras.You can opt into tiered compilation in either of two ways.

  • Para utilizar la compilación en capas en todos los proyectos que utilizan el SDK de .NET Core 2.1, establezca la variable de entorno siguiente:To use tiered compilation in all projects that use the .NET Core 2.1 SDK, set the following environment variable:

    COMPlus_TieredCompilation="1"
    
  • Para utilizar la compilación por niveles por proyecto, agregue la propiedad <TieredCompilation> a la sección <PropertyGroup> del archivo de proyecto de MSBuild, como se muestra en el ejemplo siguiente:To use tiered compilation on a per-project basis, add the <TieredCompilation> property to the <PropertyGroup> section of the MSBuild project file, as the following example shows:

    <PropertyGroup>
        <!-- other property definitions -->
    
        <TieredCompilation>true</TieredCompilation>
    </PropertyGroup>
    

Cambios en la APIAPI changes

Span<T> y Memory<T>Span<T> and Memory<T>

.NET Core 2.1 incluye algunos tipos nuevos que hacen que trabajar con matrices y otros tipos de memoria sea mucho más eficiente..NET Core 2.1 includes some new types that make working with arrays and other types of memory much more efficient. Estos nuevos tipos incluyen:The new types include:

Sin estos tipos, al pasar tales elementos como una porción de una matriz o una sección de un búfer de memoria, debe hacer una copia de una parte de los datos antes de pasarlo a un método.Without these types, when passing such items as a portion of an array or a section of a memory buffer, you have to make a copy of some portion of the data before passing it to a method. Estos tipos proporcionan una vista virtual de los datos que elimina la necesidad de ejecutar operaciones adicionales de copia y asignación de memoria.These types provide a virtual view of that data that eliminates the need for the additional memory allocation and copy operations.

En el ejemplo siguiente se usa una instancia de Span<T> y Memory<T> para proporcionar una vista virtual de 10 elementos de una matriz.The following example uses a Span<T> and Memory<T> instance to provide a virtual view of 10 elements of an array.

using System;

class Program
{
    static void Main()
    {
        int[] numbers = new int[100];
        for (int i = 0; i < 100; i++)
        {
            numbers[i] = i * 2;
        }

        var part = new Span<int>(numbers, start: 10, length: 10);
        foreach (var value in part)
            Console.Write($"{value}  ");
    }
}
// The example displays the following output:
//     20  22  24  26  28  30  32  34  36  38
Module Program
    Sub Main()
        Dim numbers As Integer() = New Integer(99) {}

        For i As Integer = 0 To 99
            numbers(i) = i * 2
        Next

        Dim part = New Memory(Of Integer)(numbers, start:=10, length:=10)

        For Each value In part.Span
            Console.Write($"{value}  ")
        Next
    End Sub
End Module
' The example displays the following output:
'     20  22  24  26  28  30  32  34  36  38

Compresión de BrotliBrotli compression

.NET Core 2.1 agrega compatibilidad con la compresión y descompresión de Brotli..NET Core 2.1 adds support for Brotli compression and decompression. Brotli es un algoritmo de compresión sin pérdida de datos de uso general que se define en RFC 7932 y es compatible con la mayoría de los exploradores web y servidores web principales.Brotli is a general-purpose lossless compression algorithm that is defined in RFC 7932 and is supported by most web browsers and major web servers. Puede usar la clase System.IO.Compression.BrotliStream basada en secuencias o las clases System.IO.Compression.BrotliEncoder y System.IO.Compression.BrotliDecoder basadas en intervalos de alto rendimiento.You can use the stream-based System.IO.Compression.BrotliStream class or the high-performance span-based System.IO.Compression.BrotliEncoder and System.IO.Compression.BrotliDecoder classes. En el ejemplo siguiente se muestra la compresión con la clase BrotliStream:The following example illustrates compression with the BrotliStream class:

public static Stream DecompressWithBrotli(Stream toDecompress)   
{
    MemoryStream decompressedStream = new MemoryStream();
    using (BrotliStream decompressionStream = new BrotliStream(toDecompress, CompressionMode.Decompress))
    {
        decompressionStream.CopyTo(decompressedStream);
    }
    decompressedStream.Position = 0;
    return decompressedStream;
}

El comportamiento de BrotliStream es el mismo que DeflateStream y GZipStream, lo que facilita la conversión de código que llama a estas API a BrotliStream.The BrotliStream behavior is the same as DeflateStream and GZipStream, which makes it easy to convert code that calls these APIs to BrotliStream.

Nuevas API de criptografía y mejoras de criptografíaNew cryptography APIs and cryptography improvements

.NET Core 2.1 incluye numerosas mejoras para las API de criptografía:.NET Core 2.1 includes numerous enhancements to the cryptography APIs:

Mejoras en los socketsSockets improvements

.NET Core incluye un nuevo tipo, System.Net.Http.SocketsHttpHandler y una reescritura System.Net.Http.HttpMessageHandler, que forman la base de las API de red de nivel superior..NET Core includes a new type, System.Net.Http.SocketsHttpHandler, and a rewritten System.Net.Http.HttpMessageHandler, that form the basis of higher-level networking APIs. System.Net.Http.SocketsHttpHandler, por ejemplo, es la base de la implementación HttpClient.System.Net.Http.SocketsHttpHandler, for example, is the basis of the HttpClient implementation. En versiones anteriores de .NET Core, las API de nivel superior se basaban en implementaciones de redes nativas.In previous versions of .NET Core, higher-level APIs were based on native networking implementations.

La implementación de sockets introducida en .NET Core 2.1 presenta una serie de ventajas:The sockets implementation introduced in .NET Core 2.1 has a number of advantages:

  • Una mejora significativa del rendimiento en comparación con la implementación anterior.A significant performance improvement when compared with the previous implementation.

  • Eliminación de las dependencias de plataforma, lo que simplifica la implementación y el mantenimiento.Elimination of platform dependencies, which simplifies deployment and servicing.

  • Comportamiento coherente en todas las plataformas de .NET Core.Consistent behavior across all .NET Core platforms.

SocketsHttpHandler es la implementación predeterminada en .NET Core 2.1.SocketsHttpHandler is the default implementation in .NET Core 2.1. Sin embargo, puede configurar su aplicación para usar la clase anterior HttpClientHandler llamando al método AppContext.SetSwitch:However, you can configure your application to use the older HttpClientHandler class by calling the AppContext.SetSwitch method:

AppContext.SetSwitch("System.Net.Http.UseSocketsHttpHandler", false);
AppContext.SetSwitch("System.Net.Http.UseSocketsHttpHandler", False)

También puede usar una variable de entorno para optar por no usar implementaciones de sockets basadas en SocketsHttpHandler.You can also use an environment variable to opt out of using sockets implementations based on SocketsHttpHandler. Para ello, configure DOTNET_SYSTEM_NET_HTTP_USESOCKETSHTTPHANDLER en false o en 0.To do this, set the DOTNET_SYSTEM_NET_HTTP_USESOCKETSHTTPHANDLER to either false or 0.

En Windows, también puede optar por usar System.Net.Http.WinHttpHandler, que se basa en una implementación nativa, o la clase SocketsHttpHandler pasando una instancia de la clase al constructor HttpClient.On Windows, you can also choose to use System.Net.Http.WinHttpHandler, which relies on a native implementation, or the SocketsHttpHandler class by passing an instance of the class to the HttpClient constructor.

En Linux y macOS, solo se puede configurar HttpClient para cada proceso.On Linux and macOS, you can only configure HttpClient on a per-process basis. En Linux, deberá implementar libcurl si desea usar la antigua implementación de HttpClient.On Linux, you need to deploy libcurl if you want to use the old HttpClient implementation. (Se instala con .NET Core 2.0).(It is installed with .NET Core 2.0.)

Vea tambiénSee also