Настройка компоновщика для ASP.NET Core Blazor

В этой статье вы узнаете, как управлять компоновщиком для промежуточного языка (IL) при создании приложения Blazor.'

Blazor WebAssembly выполняет компоновку промежуточного языка (IL) во время сборки, чтобы затем удалить ненужный IL из выходных сборок приложения. Компоновщик отключен при сборке в конфигурации отладки. Для включения компоновщика приложения должны быть построены в конфигурации выпуска. Мы рекомендуем создавать выпуск при развертывании приложений Blazor WebAssembly.

Компоновка приложения оптимизируется в зависимости от размера, но это может иметь негативные последствия. Приложения, использующие отражение или связанные динамические функции, могут прерываться при обрезке, так как компоновщик не знает об этом динамическом поведении и не может определить общие типы, необходимые для отражения во время выполнения. Чтобы обрезать такие приложения, компоновщик должен быть уведомлен о любых типах, необходимых для отражения в коде и в пакетах или платформах, от которых зависит приложение.

Чтобы обеспечить правильную работу обрезанного приложения после его развертывания, важно часто тестировать сборки выпуска приложения при разработке.

Компоновку приложений Blazor можно настроить с помощью следующих функций MSBuild:

Управление компоновкой с помощью свойства MSBuild

Компоновка включается, когда приложение собирается в конфигурации Release. Чтобы изменить это поведение, настройте свойство MSBuild BlazorWebAssemblyEnableLinking в файле проекта:

<PropertyGroup>
  <BlazorWebAssemblyEnableLinking>false</BlazorWebAssemblyEnableLinking>
</PropertyGroup>

Управление компоновкой с помощью файла конфигурации

Чтобы управлять компоновкой каждой сборки, нужно предоставить XML-файл конфигурации и указать его как элемент MSBuild в файле проекта.

<ItemGroup>
  <BlazorLinkerDescriptor Include="LinkerConfig.xml" />
</ItemGroup>

LinkerConfig.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!--
  This file specifies which parts of the BCL or Blazor packages must not be
  stripped by the IL Linker even if they aren't referenced by user code.
-->
<linker>
  <assembly fullname="mscorlib">
    <!--
      Preserve the methods in WasmRuntime because its methods are called by 
      JavaScript client-side code to implement timers.
      Fixes: https://github.com/dotnet/blazor/issues/239
    -->
    <type fullname="System.Threading.WasmRuntime" />
  </assembly>
  <assembly fullname="System.Core">
    <!--
      System.Linq.Expressions* is required by Json.NET and any 
      expression.Compile caller. The assembly isn't stripped.
    -->
    <type fullname="System.Linq.Expressions*" />
  </assembly>
  <!--
    In this example, the app's entry point assembly is listed. The assembly
    isn't stripped by the IL Linker.
  -->
  <assembly fullname="MyCoolBlazorApp" />
</linker>

Дополнительные сведения и примеры см. на странице Форматы данных (репозиторий GitHub для компоновщика dotnet).

Добавление файла конфигурации компоновщика XML в библиотеку

Чтобы настроить компоновщик для определенной библиотеки, добавьте файл конфигурации компоновщика XML в библиотеку в качестве внедренного ресурса. Имя внедренного ресурса должно совпадать с именем сборки.

В следующем примере файл LinkerConfig.xml указан как внедренный ресурс, имя которого совпадает с именем сборки библиотеки.

<ItemGroup>
  <EmbeddedResource Include="LinkerConfig.xml">
    <LogicalName>$(MSBuildProjectName).xml</LogicalName>
  </EmbeddedResource>
</ItemGroup>

Настройка компоновщика для интернационализации

По умолчанию конфигурация компоновщика Blazor для приложений Blazor WebAssembly исключает сведения об интернационализации, кроме явно запрошенных языковых стандартов. Удаление этих сборок уменьшает размер приложения.

Чтобы указать, какие сборки I18N необходимо оставить, задайте свойство MSBuild <BlazorWebAssemblyI18NAssemblies> в файле проекта:

<PropertyGroup>
  <BlazorWebAssemblyI18NAssemblies>{all|none|REGION1,REGION2,...}</BlazorWebAssemblyI18NAssemblies>
</PropertyGroup>
Значение региона Сборка для одного региона
all Включены все сборки
cjk I18N.CJK.dll
mideast I18N.MidEast.dll
none (по умолчанию) None
other I18N.Other.dll
rare I18N.Rare.dll
west I18N.West.dll

Для разделения нескольких значений используйте запятую (например, mideast,west).

Дополнительные сведения см. в статье I18N: библиотека платформы internationalization Framework Pnetlib (репозиторий mono/mono GitHub).

Дополнительные ресурсы