Compartir a través de


Configuración del recortador de ASP.NET Core Blazor

Nota

Esta no es la versión más reciente de este artículo. Para la versión actual, consulte la versión de .NET 9 de este artículo.

Advertencia

Esta versión de ASP.NET Core ya no se admite. Para obtener más información, consulte la directiva de compatibilidad de .NET y .NET Core. Para la versión actual, consulte la versión de .NET 9 de este artículo.

Importante

Esta información hace referencia a un producto en versión preliminar, el cual puede sufrir importantes modificaciones antes de que se publique la versión comercial. Microsoft no proporciona ninguna garantía, expresa o implícita, con respecto a la información proporcionada aquí.

Para la versión actual, consulte la versión de .NET 9 de este artículo.

En este artículo se explica cómo controlar el recortador de lenguaje intermedio al compilar una aplicación Blazor.

Blazor WebAssembly realiza un recorte de lenguaje intermedio (IL) para reducir el tamaño de la salida publicada. El recorte se produce cuando se publica la aplicación.

Configuración

Para configurar el recortador de IL, consulta el artículo Opciones de recorte en la documentación sobre aspectos básicos de .NET, que incluye instrucciones sobre los temas siguientes:

  • Deshabilitación del recorte para toda la aplicación con la propiedad <PublishTrimmed> en el archivo de proyecto
  • Control de la agresividad con la que el recortador de IL descarta el IL sin usar.
  • Interrupción del recorte de ensamblados específicos por parte del recortador de IL.
  • Ensamblados "raíz" para recortar
  • Obtención de advertencias para los tipos reflejados mediante el establecimiento de la propiedad <SuppressTrimAnalysisWarnings> en false en el archivo de proyecto
  • Control del recorte de símbolos y compatibilidad con el depurador.
  • Establecimiento de características de recortador de IL para las características de la biblioteca de marcos de recorte.

Granularidad del recortador predeterminada

La granularidad del recortador predeterminada para las aplicaciones Blazor es partial. Para recortar todos los ensamblados, cambia la granularidad a full en el archivo de proyecto de la aplicación:

<PropertyGroup>
  <TrimMode>full</TrimMode>
</PropertyGroup>

Para obtener más información, consulta Opciones de recorte (documentación de .NET).

Error al conservar los tipos usados por una aplicación publicada

El recorte puede tener efectos perjudiciales para una aplicación publicada que conduce a errores en tiempo de ejecución. En las aplicaciones que usan reflexión, el optimizador de IL a menudo no puede determinar los tipos necesarios para la reflexión en tiempo de ejecución y los recorta o recorta los nombres de parámetro de los métodos. Esto puede ocurrir con tipos de marcos complejos que se usan para JS la interoperabilidad, la serialización y deserialización JSON y otras operaciones.

El recortador de IL tampoco puede reaccionar a un comportamiento dinámico de la aplicación en runtime. Para asegurarte de que la aplicación recortada funciona correctamente una vez implementada, prueba la salida publicada con frecuencia durante el desarrollo.

Considere el siguiente componente del lado cliente en un Blazor Web App (.NET 8 o posterior) que deserializa una KeyValuePair colección (List<KeyValuePair<string, string>>):

@rendermode @(new InteractiveWebAssemblyRenderMode(false))
@using System.Diagnostics.CodeAnalysis
@using System.Text.Json

<dl>
    @foreach (var item in @items)
    {
        <dt>@item.Key</dt>
        <dd>@item.Value</dd>
    }
</dl>

@code {
    private List<KeyValuePair<string, string>> items = [];

    [StringSyntax(StringSyntaxAttribute.Json)]
    private const string data =
        """[{"key":"key 1","value":"value 1"},{"key":"key 2","value":"value 2"}]""";

    protected override void OnInitialized()
    {
        JsonSerializerOptions options = new() { PropertyNameCaseInsensitive = true };

        items = JsonSerializer
            .Deserialize<List<KeyValuePair<string, string>>>(data, options)!;
    }
}

El componente anterior se ejecuta normalmente cuando la aplicación se ejecuta localmente y genera la siguiente lista de definiciones representadas (<dl>):

key 1
value 1
key 2
value 2

Cuando se publica la aplicación, KeyValuePair se recorta de la aplicación, incluso a pesar de establecer la <PublishTrimmed> propiedadfalse en en el archivo del proyecto. El acceso al componente produce la siguiente excepción:

Unhandled exception rendering component: ConstructorContainsNullParameterNames, System.Collections.Generic.KeyValuePair`2[System.String,System.String]

Para abordar los tipos perdidos, tenga en cuenta los siguientes enfoques.

Mantener el tipo como una dependencia dinámica

Se recomienda crear una dependencia dinámica para conservar el tipo con el [DynamicDependency] atributo .

Si aún no está presente, agregue una @using directiva para System.Diagnostics.CodeAnalysis:

@using System.Diagnostics.CodeAnalysis

Agregue un [DynamicDependency] atributo para conservar el KeyValuePair.

+ [DynamicDependency(DynamicallyAccessedMemberTypes.PublicConstructors, typeof(KeyValuePair<string, string>))]
private List<KeyValuePair<string, string>> items = [];

Tipos personalizados

Las modificaciones siguientes crean un StringKeyValuePair tipo para su uso por parte del componente.

StringKeyValuePair.cs:

[method: SetsRequiredMembers]
public sealed class StringKeyValuePair(string key, string value)
{
    public required string Key { get; init; } = key;
    public required string Value { get; init; } = value;
}

El componente se modifica para usar el StringKeyValuePair tipo :

- private List<KeyValuePair<string, string>> items = [];
+ private List<StringKeyValuePair> items = [];
- items = JsonSerializer.Deserialize<List<KeyValuePair<string, string>>>(data, options)!;
+ items = JsonSerializer.Deserialize<List<StringKeyValuePair>>(data, options)!;

Dado que los tipos personalizados nunca son recortados por Blazor cuando se publica una app, el componente funciona como fue diseñado después de publicar la app.

Recursos adicionales