Condividi tramite


Configurare il Trimmer per ASP.NET Core Blazor

Nota

Questa non è la versione più recente di questo articolo. Per la versione corrente, vedere la versione .NET 9 di questo articolo.

Avviso

Questa versione di ASP.NET Core non è più supportata. Per altre informazioni, vedere i criteri di supporto di .NET e .NET Core. Per la versione corrente, vedere la versione .NET 9 di questo articolo.

Importante

Queste informazioni si riferiscono a un prodotto non definitive che può essere modificato in modo sostanziale prima che venga rilasciato commercialmente. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.

Per la versione corrente, vedere la versione .NET 9 di questo articolo.

Questo articolo spiega come controllare l'IL Trimmer durante la compilazione di un'app Blazor.

Blazor WebAssembly esegue il taglio del linguaggio intermedio (IL) per ridurre le dimensioni dell'output pubblicato. Il trimming si verifica durante la pubblicazione di un'app.

Impostazione

Per configurare il trimmer IL, vedere l'articolo Opzioni trimming nella documentazione di .NET Fundamentals, che include indicazioni sugli argomenti seguenti:

  • Disabilitare la rifilatura per l'intera app tramite la proprietà <PublishTrimmed> nel file di progetto.
  • Controlla come l'IL non utilizzato venga rimosso aggressivamente dal trimmer IL.
  • Impedire al trimmer IL di tagliare assembly specifici.
  • Assembly "radice" per il taglio.
  • Avvisi di superficie per i tipi riflessi impostando la <SuppressTrimAnalysisWarnings> proprietà su false nel file di progetto.
  • Controllo del taglio dei simboli e supporto del debugger.
  • Impostare le funzionalità di Trimmer IL per le funzionalità della libreria del framework di taglio.

Granularità del trimmer predefinita

La granularità predefinita del trimmer per Blazor le app è partial. Per tagliare tutti gli assembly, modificare la granularità in full nel file di progetto dell'app:

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

Per altre informazioni, vedere Opzioni di trimming (documentazione di .NET).

Mancata conservazione dei tipi usati da un'app pubblicata

Il trimming può avere effetti negativi su un'app pubblicata, portando a errori di runtime. Nelle app che usano la reflection, Il Trimmer spesso non riesce a determinare i tipi necessari per la reflection di runtime e li elimina o rimuove i nomi dei parametri dai metodi. Ciò può verificarsi con tipi di framework complessi usati per JS l'interoperabilità, la serializzazione/deserializzazione JSON e altre operazioni.

Anche il trimmer IL non è in grado di reagire al comportamento dinamico di un'app in fase di esecuzione. Per assicurarsi che l'app tagliata funzioni correttamente dopo la distribuzione, testare frequentemente l'output pubblicato durante lo sviluppo.

Si consideri il componente lato client seguente in un ambiente Blazor Web App (.NET 8 o versione successiva) che deserializza una KeyValuePair raccolta (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)!;
    }
}

Il componente precedente viene eseguito normalmente quando l'app viene eseguita in locale e produce l'elenco di definizioni sottoposto a rendering seguente (<dl>):

key 1
value 1
key 2
value 2

Quando l'app viene pubblicata, KeyValuePair viene tagliata dall'app, anche nonostante l'impostazione della <PublishTrimmed> proprietà su false nel file di progetto. L'accesso al componente genera l'eccezione seguente:

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

Per affrontare i tipi mancanti, prendere in considerazione gli approcci seguenti.

Mantenere il tipo come dipendenza dinamica

È consigliabile creare una dipendenza dinamica per preservare il tipo con l'attributo [DynamicDependency].

Se non è già presente, aggiungere una @using direttiva per System.Diagnostics.CodeAnalysis:

@using System.Diagnostics.CodeAnalysis

Aggiungi un [DynamicDependency] attributo per preservare KeyValuePair:

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

Tipi personalizzati

Le modifiche seguenti creano un StringKeyValuePair tipo per l'uso da 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;
}

Il componente viene modificato per usare il 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)!;

Poiché i tipi personalizzati non vengono mai eliminati da Blazor quando un'app viene pubblicata, il componente funziona come previsto dopo la pubblicazione dell'app.

Risorse aggiuntive