Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Varning
Den här versionen av ASP.NET Core stöds inte längre. Mer information finns i .NET och .NET Core Support Policy. För den nuvarande utgåvan, se .NET 9-versionen av den här artikeln .
Viktigt!
Den här informationen gäller en förhandsversionsprodukt som kan ändras avsevärt innan den släpps kommersiellt. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, med avseende på den information som tillhandahålls här.
För den nuvarande utgåvan, se .NET 9-versionen av den här artikeln .
Den här artikeln beskriver hur du styr mellanliggande kodtrimmern (IL) när du skapar en Blazor-app.
Blazor WebAssembly utför Intermediate Language (IL) trimming för att minska storleken på det publicerade resultatet. När du publicerar en app sker trimning.
Standardkornighet för trimmer
Standardkornigheten för Blazor appar är partial, vilket innebär att endast kärnramverksbibliotek och bibliotek som uttryckligen har aktiverat trimningsstöd trimmas. Fullständig trimning stöds inte.
Mer information finns i Trimningsalternativ (.NET-dokumentation).
Konfiguration
Information om hur du konfigurerar IL Trimmer finns i artikeln Trimningsalternativ i .NET Fundamentals-dokumentationen, som innehåller vägledning om följande ämnen:
- Inaktivera trimning för hela appen med <PublishTrimmed>egenskapen i projektfilen.
- Kontrollera hur aggressivt oanvänd IL ignoreras av IL Trimmer.
- Stoppa IL Trimmer från att trimma specifika sammansättningar.
- "Root"-sammansättningar för trimning.
- Ange ytvarningar för reflekterade typer genom att ställa in egenskapsvärdet <SuppressTrimAnalysisWarnings>tillfalsei projektfilen.
- Stöd för trimning och felsökning av kontrollsymboler.
- Ange IL Trimmer-funktioner för att trimma ramverksbiblioteksfunktioner.
När trimmerkornigheten är partial, vilket är standardvärdet, trimmar IL Trimmer basklassbiblioteket och andra sammansättningar som markerats som trimmable. Om du vill välja att trimma i något av appens klassbiblioteksprojekt anger du <IsTrimmable> egenskapen MSBuild till true i dessa projekt:
<PropertyGroup>
  <IsTrimmable>true</IsTrimmable>
</PropertyGroup>
Vägledning som gäller för .NET-bibliotek finns i Förbereda .NET-bibliotek för trimning.
Det gick inte att bevara typer som används av en publicerad app
Trimning kan ha skadliga effekter för en publicerad app som leder till körningsfel, även om egenskapen anges <PublishTrimmed> till false i projektfilen. I appar som använder reflektion kan IL Trimmer ofta inte fastställa vilka typer som krävs för körningsreflektion och trimmar bort dem eller trimmar bort parameternamn från metoder. Detta kan inträffa med komplexa ramverkstyper som används för JS interop, JSON-serialisering/deserialisering och andra åtgärder.
IL Trimmer kan inte heller reagera på en apps dynamiska beteende vid körning. Testa publicerade utdata ofta under utveckling för att säkerställa att den trimmade appen fungerar korrekt när den har distribuerats.
Tänk dig följande exempel som utför JSON-deserialisering i en Tuple<T1,T2> samling (List<Tuple<string, string>>).
              TrimExample.razor:
@page "/trim-example"
@using System.Diagnostics.CodeAnalysis
@using System.Text.Json
<h1>Trim Example</h1>
<ul>
    @foreach (var item in @items)
    {
        <li>@item.Item1, @item.Item2</li>
    }
</ul>
@code {
    private List<Tuple<string, string>> items = [];
    [StringSyntax(StringSyntaxAttribute.Json)]
    private const string data =
        """[{"item1":"1:T1","item2":"1:T2"},{"item1":"2:T1","item2":"2:T2"}]""";
    protected override void OnInitialized()
    {
        JsonSerializerOptions options = new() { PropertyNameCaseInsensitive = true };
        items = JsonSerializer
            .Deserialize<List<Tuple<string, string>>>(data, options)!;
    }
}
Den föregående komponenten körs normalt när appen körs lokalt och skapar följande renderade lista:
• 1:T1, 1:T2
• 2:T2, 2:T2
När appen publiceras Tuple<T1,T2> trimmas den från appen, även om egenskapen har angetts <PublishTrimmed> till false i projektfilen. När du kommer åt komponenten genereras följande undantag:
crit: Microsoft.AspNetCore.Components.WebAssembly.Rendering.WebAssemblyRenderer[100]
Unhandled exception rendering component: ConstructorContainsNullParameterNames, System.Tuple`2[System.String,System.String]
System.NotSupportedException: ConstructorContainsNullParameterNames, System.Tuple`2[System.String,System.String]
Överväg att använda någon av följande metoder för att åtgärda förlorade typer.
Anpassade typer
För att undvika problem med .NET-trimning i scenarier som förlitar sig på reflektion, till exempel JS interop och JSON-serialisering, använder du anpassade typer som definierats i icke-trimmade bibliotek eller bevarar typerna via länkkonfiguration.
Följande ändringar skapar en StringTuple typ för komponentens användning.
              StringTuple.cs:
[method: SetsRequiredMembers]
public sealed class StringTuple(string item1, string item2)
{
    public required string Item1 { get; init; } = item1;
    public required string Item2 { get; init; } = item2;
}
Komponenten modifieras för att använda typen StringTuple:
- private List<Tuple<string, string>> items = [];
+ private List<StringTuple> items = [];
- items = JsonSerializer.Deserialize<List<Tuple<string, string>>>(data, options)!;
+ items = JsonSerializer.Deserialize<List<StringTuple>>(data, options)!;
Eftersom anpassade typer som definierats i icke-trimmade sammansättningar inte trimmas av Blazor när en app publiceras, fungerar komponenten som den är utformad efter att appen har publicerats.
Om du föredrar att använda ramverkstyper trots vår rekommendation använder du någon av följande metoder:
Om du föredrar att använda ramverkstyper trots vår rekommendation bevarar du typen som ett dynamiskt beroende.
Bevara typen som ett dynamiskt beroende
Skapa ett dynamiskt beroende för att bevara typen med attributet[DynamicDependency].
Om det inte redan finns lägger du till ett @using direktiv för System.Diagnostics.CodeAnalysis:
@using System.Diagnostics.CodeAnalysis
Lägg till ett [DynamicDependency] attribut för att bevara Tuple<T1,T2>:
+ [DynamicDependency(DynamicallyAccessedMemberTypes.PublicConstructors, 
+     typeof(Tuple<string, string>))]
private List<Tuple<string, string>> items = [];
Använda en rotbeskrivning
En rotbeskrivning kan bevara typen.
Lägg till en ILLink.Descriptors.xml fil i appens rot† med typen :
<linker>
  <assembly fullname="System.Private.CoreLib">
    <type fullname="System.Tuple`2" preserve="all" />
  </assembly>
</linker>
†Roten i appen refererar till appens Blazor WebAssembly rot eller roten .Client för projektet i en Blazor Web App (.NET 8 eller senare).
Lägg till ett TrimmerRootDescriptor objekt i appens projektfil‡ som refererar ILLink.Descriptors.xml till filen:
<ItemGroup>
  <TrimmerRootDescriptor Include="$(MSBuildThisFileDirectory)ILLink.Descriptors.xml" />
</ItemGroup>
‡Projektfilen är antingen appens Blazor WebAssembly projektfil eller projektfilen för .Client projektet i en Blazor Web App (.NET 8 eller senare).
Lösning i .NET 8
Som en lösning i .NET 8 kan du lägga till _ExtraTrimmerArgs egenskapen MSBuild inställd --keep-metadata parametername på i appens projektfil för att bevara parameternamn under trimningen:
<PropertyGroup>
  <_ExtraTrimmerArgs>--keep-metadata parametername</_ExtraTrimmerArgs>
</PropertyGroup>
Ytterligare resurser
ASP.NET Core