Configurare il linker per ASP.NET Core Blazor

Questo articolo illustra come controllare il linker intermedio (IL) durante la compilazione di un'app Blazor .

Blazor WebAssembly esegue il collegamento del linguaggio intermedio durante una compilazione per ridurre il carico interno non necessario dagli assembly di output dell'app. Il linker è disabilitato durante la compilazione in Configurazione di debug. Le app devono essere compilate nella configurazione release per abilitare il linker. Ti consigliamo di compilare in Release durante la Blazor WebAssembly distribuzione delle app.

Il collegamento di un'app ottimizza le dimensioni, ma può avere effetti negativi. Le app che usano la reflection o le funzionalità dinamiche correlate possono interrompersi quando vengono eliminate perché il linker non conosce questo comportamento dinamico e non può determinare in generale quali tipi sono necessari per la reflection in fase di esecuzione. Per tagliare tali app, il linker deve essere informato su qualsiasi tipo richiesto dalla reflection nel codice e nei pacchetti o framework da cui dipende l'app.

Per assicurarsi che l'app tagliata funzioni correttamente dopo la distribuzione, è importante testare frequentemente le build di rilascio dell'app durante lo sviluppo.

Il collegamento per Blazor le app può essere configurato usando queste funzionalità di MSBuild:

Controllare il collegamento con una proprietà MSBuild

Il collegamento è abilitato quando un'app è incorporata nella Release configurazione. Per modificare questa operazione, configurare la BlazorWebAssemblyEnableLinking proprietà MSBuild nel file di progetto:

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

Controllare il collegamento con un file di configurazione

Controllare il collegamento per ogni singolo assembly usando un file di configurazione XML e specificando il file come un elemento MSBuild nel file di progetto:

<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>

Per altre informazioni ed esempi, vedere Formati di dati (repository GitHub dotnet/linker).

Aggiungere un file di configurazione del linker XML a una libreria

Per configurare il linker per una libreria specifica, aggiungere un file di configurazione del linker XML nella libreria come risorsa incorporata. La risorsa incorporata deve avere lo stesso nome dell'assembly.

Nell'esempio seguente il LinkerConfig.xml file viene specificato come risorsa incorporata con lo stesso nome dell'assembly della libreria:

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

Configurare il linker per l'internazionalizzazione

Per impostazione predefinita, Blazorla configurazione del linker per Blazor WebAssembly le app rimuove le informazioni di internazionalizzazione, ad eccezione delle impostazioni locali richieste in modo esplicito. La rimozione di questi assembly riduce al minimo le dimensioni dell'app.

Per controllare quali assembly I18N vengono conservati, impostare la <BlazorWebAssemblyI18NAssemblies> proprietà MSBuild nel file di progetto:

<PropertyGroup>
  <BlazorWebAssemblyI18NAssemblies>{all|none|REGION1,REGION2,...}</BlazorWebAssemblyI18NAssemblies>
</PropertyGroup>
Valore area Assembly di area mono
all Tutti gli assembly inclusi
cjk I18N.CJK.dll
mideast I18N.MidEast.dll
none (predefinito) None
other I18N.Other.dll
rare I18N.Rare.dll
west I18N.West.dll

Usare una virgola per separare più valori , ad esempio mideast,west.

Per altre informazioni, vedere I18N: Pnetlib Internationalization Framework Library (repository GitHub mono/mono).

Risorse aggiuntive