Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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à sufalse
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.