Recorte de implementaciones autocontenidas y ejecutablesTrim self-contained deployments and executables

El modelo de implementación dependiente del marco ha sido el modelo de implementación más eficaz desde el inicio de .NET.The framework-dependent deployment model has been the most successful deployment model since the inception of .NET. En este escenario, el desarrollador de la aplicación agrupa solo la aplicación y los ensamblados de terceros con la expectativa de que las bibliotecas del entorno de ejecución y el marco de .NET estén disponibles en el equipo cliente.In this scenario, the application developer bundles only the application and third-party assemblies with the expectation that the .NET runtime and framework libraries will be available in the client machine. Este modelo de implementación sigue siendo el dominante en .NET Core, pero hay algunos escenarios en los que el modelo dependiente del marco no es óptimo.This deployment model continues to be the dominant one in .NET Core as well but there are some scenarios where the framework-dependent model is not optimal. La alternativa es publicar una aplicación independiente, donde el entorno de ejecución y el marco de .NET Core están agrupados con la aplicación y ensamblados de terceros.The alternative is to publish a self-contained application, where the .NET Core runtime and framework are bundled together with the application and third-party assemblies.

El modelo de implementación trim independiente es una versión especializada del modelo de implementación independiente que está optimizado para reducir el tamaño de la implementación.The trim-self-contained deployment model is a specialized version of the self-contained deployment model that is optimized to reduce deployment size. Minimizar el tamaño de la implementación es un requisito fundamental para algunos escenarios del lado cliente, como las aplicaciones Blazor.Minimizing deployment size is a critical requirement for some client-side scenarios like Blazor applications. En función de la complejidad de la aplicación, solo se hace referencia a un subconjunto de ensamblados de marco, y se requiere un subconjunto del código en cada ensamblado para ejecutar la aplicación.Depending on the complexity of the application, only a subset of the framework assemblies are referenced, and a subset of the code within each assembly is required to run the application. Las partes sin usar de las bibliotecas no son necesarias y se pueden recortar de la aplicación empaquetada.The unused parts of the libraries are unnecessary and can be trimmed from the packaged application.

No obstante, existe el riesgo de que el análisis del tiempo de compilación de la aplicación pueda causar errores en tiempo de ejecución, debido a que no puede analizar de forma confiable diversos patrones de código problemáticos (centrados en gran medida en el uso de la reflexión).However, there is a risk that the build time analysis of the application can cause failures at runtime, due to not being able to reliably analyze various problematic code patterns (largely centered on reflection use). Dado que no se puede garantizar la confiabilidad, este modelo de implementación se ofrece como una característica en versión preliminar.Because reliability can't be guaranteed, this deployment model is offered as a preview feature.

El motor de análisis en tiempo de compilación proporciona advertencias al desarrollador de los patrones de código problemáticos para detectar qué otro código es necesario.The build time analysis engine provides warnings to the developer of code patterns that are problematic to detect which other code is required. El código se puede anotar con atributos para indicar al recortador qué más se debe incluir.Code can be annotated with attributes to tell the trimmer what else to include. Muchos patrones de reflexión se pueden reemplazar por la generación de código en tiempo de compilación mediante generadores de código fuente.Many reflection patterns can be replaced with build-time code generation using Source Generators.

El modo de recorte de las aplicaciones se configura con TrimMode.The trim mode for the applications is configured with the TrimMode setting. El valor predeterminado es copyused y agrupa los ensamblados a los que se hace referencia con la aplicación.The default value is copyused and bundles referenced assemblies with the application. El valor link se usa con las aplicaciones WebAssembly de Blazor y recorta el código no usado dentro de los ensamblados.The link value is used with Blazor WebAssembly applications and trims unused code within assemblies. Las advertencias de análisis de recorte proporcionan información sobre patrones de código en los que no es posible realizar análisis de dependencias completas.Trim analysis warnings give information on code patterns where a full dependency analysis was not possible. Estas advertencias se suprimen de forma predeterminada y se pueden activar estableciendo la marca SuppressTrimAnalysisWarnings en false.These warnings are suppressed by default and can be turned on by setting the flag SuppressTrimAnalysisWarnings to false. Para obtener más información acerca de las opciones de recorte disponibles, vea Opciones de recorte.For more information about the trim options available, see Trimming options.

Nota

El recorte es una característica experimental en .NET Core 3.1 y .NET 5.0.Trimming is an experimental feature in .NET Core 3.1 and .NET 5.0. Solo está disponible para las aplicaciones que se publican como independientes.Trimming is only available to applications that are published self-contained.

Impedir que los ensamblados se recortenPrevent assemblies from being trimmed

Hay escenarios en los que la función de recorte no podrá detectar referencias.There are scenarios in which the trimming functionality will fail to detect references. Por ejemplo, cuando se usa la reflexión en un ensamblado en tiempo de ejecución, ya sea por parte de la aplicación o por una biblioteca a la que haga referencia la aplicación, no se hace referencia directamente al ensamblado.For example, when reflection is used on a runtime assembly, either by your application or a library that is referenced by your application, the assembly isn't directly referenced. El recorte desconoce estas referencias indirectas y excluirá la biblioteca de la carpeta publicada.Trimming is unaware of these indirect references and would exclude the library from the published folder.

Cuando el código hace referencia indirectamente a un ensamblado mediante la reflexión, puede evitar que el ensamblado se recorte con la configuración <TrimmerRootAssembly>.When the code is indirectly referencing an assembly through reflection, you can prevent the assembly from being trimmed with the <TrimmerRootAssembly> setting. En el ejemplo siguiente se muestra cómo evitar que un ensamblado llamado System.Security se recorte:The following example shows how to prevent an assembly called System.Security assembly from being trimmed:

<ItemGroup>
    <TrimmerRootAssembly Include="System.Security" />
</ItemGroup>

Compatibilidad con certificados SSLSupport for SSL certificates

Si la aplicación carga certificados SSL, como en el caso de una aplicación de ASP.NET Core, querrá asegurarse de evitar el recorte de los ensamblados que facilitan la carga de los certificados SSL.If your app loads SSL certificates, such as in an ASP.NET Core app, you'll want to ensure that when trimming you prevent trimming assemblies that will help with loading SSL certificates.

Se puede actualizar el archivo del proyecto para incluir lo siguiente en ASP.NET Core 3.1:We can update our project file to include the following for ASP.NET Core 3.1:

<Project Sdk="Microsoft.NET.Sdk.Web">
  <PropertyGroup>...</PropertyGroup>
  <!--Include the following for .aspnetcore 3.1-->
  <ItemGroup>
    <TrimmerRootAssembly Include="System.Net" />
    <TrimmerRootAssembly Include="System.Net.Security" />
    <TrimmerRootAssembly Include="System.Security" />
  </ItemGroup>
  ...
</Project>

Si se usa .NET 5.0, se puede actualizar el archivo del proyecto para incluir lo siguiente:If we're using .Net 5.0, we can update our project file to include the following:

<Project Sdk="Microsoft.NET.Sdk.Web">
 <PropertyGroup>...</PropertyGroup>
 <!--Include the following for .net 5.0-->
 <ItemGroup>
    <TrimmerRootAssembly Include="System.Net.Security" />
    <TrimmerRootAssembly Include="System.Security" />
  </ItemGroup>
  ...
</Project>

Recorte de la aplicación: CLITrim your app - CLI

Recorte la aplicación mediante el comando dotnet publish.Trim your application using the dotnet publish command. Al publicar la aplicación, establezca las propiedades siguientes:When you publish your app, set the following properties:

  • Publicar como una aplicación independiente para un entorno de ejecución específico: -r win-x64Publish as a self-contained app for a specific runtime: -r win-x64
  • Habilitar recorte: /p:PublishTrimmed=trueEnable trimming: /p:PublishTrimmed=true

En este ejemplo se publica una aplicación para Windows como independiente y se recorta la salida.The following example publishes an app for Windows as self-contained and trims the output.

<PropertyGroup>
    <RuntimeIdentifier>win-x64</RuntimeIdentifier>
    <PublishTrimmed>true</PublishTrimmed>
</PropertyGroup>

En este ejemplo se publica una aplicación en el modo de recorte agresivo en el que el código no usado dentro de los ensamblados se desactivará y se habilitarán las advertencias de recorte.The following example publishes an app in the aggressive trim mode where unused code within assemblies will be trimmed and trimmer warnings enabled.

<PropertyGroup>
    <RuntimeIdentifier>win-x64</RuntimeIdentifier>
    <PublishTrimmed>true</PublishTrimmed>
    <TrimMode>link</TrimMode>
    <SuppressTrimAnalysisWarnings>false</SuppressTrimAnalysisWarnings>
</PropertyGroup>

Para obtener más información, vea Publicación de aplicaciones .NET Core con la CLI de .NET Core.For more information, see Publish .NET Core apps with .NET Core CLI.

Recorte de la aplicación: Visual StudioTrim your app - Visual Studio

Visual Studio crea perfiles de publicación reutilizables que controlan cómo se publica la aplicación.Visual Studio creates reusable publishing profiles that control how your application is published.

  1. En el panel Explorador de soluciones , haga clic con el botón derecho en el proyecto que quiera publicar.On the Solution Explorer pane, right-click on the project you want to publish. Seleccione Publicar... .Select Publish....

    Explorador de soluciones con un menú contextual en el que se resalta la opción Publicar.

    Si todavía no tiene un perfil de publicación, siga las instrucciones para crear uno y elija el tipo de destino Carpeta.If you don't already have a publishing profile, follow the instructions to create one and choose the Folder target-type.

  2. Elija Editar.Choose Edit.

    Perfil de publicación de Visual Studio con el botón Editar.

  3. En el cuadro de diálogo Configuración de perfil , establezca las opciones siguientes:In the Profile settings dialog, set the following options:

    • Establezca Modo de implementación en Independiente.Set Deployment mode to Self-contained.
    • Establezca Tiempo de ejecución de destino en la plataforma en la que quiera publicar.Set Target runtime to the platform you want to publish to.
    • Seleccione Quitar los ensamblados no usados (en versión preliminar) .Select Trim unused assemblies (in preview).

    Elija Guardar para guardar la configuración y volver al cuadro de diálogo Publicar.Choose Save to save the settings and return to the Publish dialog.

    Cuadro de diálogo Configuración de perfil con las opciones Modo de implementación, Tiempo de ejecución de destino y Quitar los ensamblados no usados resaltadas.

  4. Elija Publicar para publicar la aplicación recortada.Choose Publish to publish your app trimmed.

Para obtener más información, vea Publicación de aplicaciones .NET Core con Visual Studio.For more information, see Publish .NET Core apps with Visual Studio.

Recorte de la aplicación: Visual Studio para MacTrim your app - Visual Studio for Mac

Visual Studio para Mac no proporciona opciones para recortar la aplicación durante la publicación.Visual Studio for Mac doesn't provide options to trim your app during publish. Tendrá que publicar de forma manual mediante las instrucciones de la sección Recorte de la aplicación: CLI.You'll need to publish manually by following the instructions from the Trim your app - CLI section. Para obtener más información, vea Publicación de aplicaciones .NET Core con la CLI de .NET Core.For more information, see Publish .NET Core apps with .NET Core CLI.

Vea tambiénSee also