Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Hinweis
Dies ist nicht die neueste Version dieses Artikels. Die aktuelle Version finden Sie in der .NET 9-Version dieses Artikels.
Warnung
Diese Version von ASP.NET Core wird nicht mehr unterstützt. Weitere Informationen finden Sie in der .NET- und .NET Core-Supportrichtlinie. Die aktuelle Version finden Sie in der .NET 9-Version dieses Artikels.
Wichtig
Diese Informationen beziehen sich auf ein Vorabversionsprodukt, das vor der kommerziellen Freigabe möglicherweise noch wesentlichen Änderungen unterliegt. Microsoft gibt keine Garantie, weder ausdrücklich noch impliziert, hinsichtlich der hier bereitgestellten Informationen.
Die aktuelle Version finden Sie in der .NET 9-Version dieses Artikels.
In diesem Artikel wird erläutert, wie Sie den IL-Trimmer (Intermediate Language, Zwischensprache) beim Erstellen einer Blazor-App steuern.
Blazor WebAssembly führt eine IL-Kürzung (Intermediate Language, Zwischensprache) aus, um die Größe der veröffentlichten Ausgabe zu verringern. Das Abschneiden erfolgt bei der Veröffentlichung einer App.
Konfiguration
Informationen zum Konfigurieren des IL-Trimmers finden Sie im Artikel Kürzungsoptionen in der Dokumentation zu .NET-Grundlagen, die zudem Leitlinien zu folgenden Themen enthält:
- Deaktivieren der Kürzung für die gesamte App mit der Eigenschaft
<PublishTrimmed>
in der Projektdatei - Steuern, wie aggressiv nicht verwendete IL vom IL-Trimmer verworfen wird
- Verhindern, dass der IL-Trimmer bestimmte Assemblys kürzt
- „Root“-Assemblys (Stammassemblys) für die Kürzung
- Oberflächenwarnungen für reflektierte Typen, indem die
<SuppressTrimAnalysisWarnings>
-Eigenschaft in der Projektdatei auffalse
festgelegt wird. - Steuern der Symbolkürzung und Debuggerunterstützung
- Festlegen von IL-Trimmerfeatures für Bibliotheksfeatures des Trimmingframeworks
Standardmäßige Granularität des Trimmers
Die Standardmäßige Trimmer-Granularität für Blazor Apps ist partial
. Um alle Assemblys zu kürzen, ändern Sie die Granularität full
in die Projektdatei der App:
<PropertyGroup>
<TrimMode>full</TrimMode>
</PropertyGroup>
Weitere Informationen finden Sie in der Trimming-Optionen (.NET-Dokumentation).
Fehler beim Beibehalten von Typen, die von einer veröffentlichten App verwendet werden
Das Kürzen kann nachteilige Auswirkungen für eine veröffentlichte App haben, die zu Laufzeitfehlern führt. In Apps, die Spiegelung verwenden, kann der IL Trimmer häufig nicht die erforderlichen Typen für die Laufzeitspiegelung bestimmen und sie abschneiden oder Parameternamen von Methoden abschneiden. Dies kann bei komplexen Frameworktypen geschehen, die für JS Interop, JSON-Serialisierung/Deserialisierung und andere Vorgänge verwendet werden.
Der IL-Trimmer kann auch nicht auf das dynamische Verhalten einer App zur Laufzeit reagieren. Wenn Sie sicherstellen möchten, dass die gekürzte App nach der Bereitstellung ordnungsgemäß funktioniert, testen Sie während der Entwicklung regelmäßig die veröffentlichte Ausgabe.
Betrachten Sie die folgende clientseitige Komponente in einer Blazor Web App (.NET 8 oder höher), die eine KeyValuePair Auflistung deserialisiert (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)!;
}
}
Die vorhergehende Komponente wird normalerweise ausgeführt, wenn die App lokal ausgeführt wird und die folgende gerenderte Definitionsliste erzeugt (<dl>
):
key 1
value 1
key 2
value 2
Wenn die App veröffentlicht wird, KeyValuePair wird aus der App entfernt, selbst wenn die Eigenschaft <PublishTrimmed>
im Projektdatei auf false
gesetzt ist. Der Zugriff auf die Komponente löst die folgende Ausnahme aus:
Unhandled exception rendering component: ConstructorContainsNullParameterNames, System.Collections.Generic.KeyValuePair`2[System.String,System.String]
Berücksichtigen Sie die folgenden Ansätze, um verlorene Typen zu beheben.
Erhalte den Typ als dynamische Abhängigkeit
Es wird empfohlen, eine dynamische Abhängigkeit zu erstellen, um den Typ mit dem [DynamicDependency]
Attribut beizubehalten.
Falls noch nicht vorhanden, fügen Sie eine @using
Direktive für System.Diagnostics.CodeAnalysis:
@using System.Diagnostics.CodeAnalysis
Fügen Sie ein [DynamicDependency]
Attribut hinzu, um folgendes KeyValuePairbeizubehalten:
+ [DynamicDependency(DynamicallyAccessedMemberTypes.PublicConstructors, typeof(KeyValuePair<string, string>))]
private List<KeyValuePair<string, string>> items = [];
Benutzerdefinierte Typen
Die folgenden Änderungen erstellen einen StringKeyValuePair
Typ für die Verwendung durch die Komponente.
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;
}
Die Komponente wird geändert, um den StringKeyValuePair
Typ zu verwenden:
- 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)!;
Da benutzerdefinierte Typen nie gekürzt Blazor werden, wenn eine App veröffentlicht wird, funktioniert die Komponente wie entworfen, nachdem die App veröffentlicht wurde.