注意
這不是這篇文章的最新版本。 如需目前的版本,請參閱 本文的 .NET 9 版本。
警告
不再支援此版本的 ASP.NET Core。 如需詳細資訊,請參閱 .NET 和 .NET Core 支持原則。 如需目前的版本,請參閱 本文的 .NET 9 版本。
本文說明如何在建置 Blazor 應用程式時,控制中繼語言 (IL) 修剪器。
Blazor WebAssembly 會執行中繼語言 (IL) 修剪,以減少已發佈輸出的大小。 發佈應用程式時會發生修剪。
組態
若要設定 IL 修剪器,請參閱 .NET 基本概念文件中的修剪選項一文,其中包含下列主題的指引:
- 使用專案檔中的
<PublishTrimmed>
屬性,停用整個應用程式的修剪。 - 控制 IL 修剪器積極捨棄未使用 IL 的方式。
- 停止 IL 修剪器修剪特定組件。
- 用於修剪的「根」組件。
- 在專案檔中將
<SuppressTrimAnalysisWarnings>
屬性設定為false
,以針對反映的類型顯露警告。 - 控制符號精簡和除錯支援。
- 設定 IL 修剪器功能以便修剪架構程式庫功能。
預設修剪器粒度
Blazor 應用程式的預設修剪器粒度為 partial
。 若要修剪所有組件,請在應用程式的專案檔中將粒度變更為 full
:
<PropertyGroup>
<TrimMode>full</TrimMode>
</PropertyGroup>
如需詳細資訊,請參閱修剪選項 (.NET 文件)。
無法保留已發行應用程式所使用的類型
修剪可能會對已發行的應用程式造成有害影響,而導致運行時錯誤。 在使用 反映的應用程式中,IL 修剪器通常無法判斷運行時間反映的必要類型,並修剪它們,或從方法修剪參數名稱。 這可能發生於用於 JS 互操作、JSON 序列化/反序列化和其他操作的複雜框架類型。
IL 修剪器也無法在執行階段對應用程式的動態行為做出反應。 為了確保已修剪的應用程式在部署後正常運作,請在開發時經常測試已發佈的輸出。
請考慮以下用戶端元件(位於 ASP.NET Core 8.0 或更新版本中),它可反序列化一個Blazor Web App集合KeyValuePairList<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)!;
}
}
上述元件會在應用程式在本機執行時正常執行,併產生下列轉譯的定義清單 (<dl>
):
key 1
value 1
key 2
value 2
發佈應用程式時,即使在項目檔中將屬性<PublishTrimmed>
設定為,false
仍會從應用程式中被移除。 存取元件會拋出以下例外狀況:
Unhandled exception rendering component: ConstructorContainsNullParameterNames, System.Collections.Generic.KeyValuePair`2[System.String,System.String]
若要解決遺失的類型,請考慮下列方法。
將類型保留為動態相依性
建議您建立動態相依性,以使用[DynamicDependency]
屬性來保持型別。
如果還不存在,請新增 @using
的 System.Diagnostics.CodeAnalysis指示詞:
@using System.Diagnostics.CodeAnalysis
新增[DynamicDependency]
屬性以保留KeyValuePair:
+ [DynamicDependency(DynamicallyAccessedMemberTypes.PublicConstructors, typeof(KeyValuePair<string, string>))]
private List<KeyValuePair<string, string>> items = [];
自訂類型
下列修改會建立 StringKeyValuePair
型別以供元件使用。
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;
}
元件會修改為使用 StringKeyValuePair
類型:
- 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)!;
由於在發佈應用程式時,絕不會修剪 Blazor 自定義類型,因此元件在發佈應用程式之後會如設計般運作。