自己完結型の展開と実行可能ファイルのトリミング

フレームワークに依存するデプロイ モデルは、.NET の開始以降に最も一般的となったデプロイ モデルです。 このシナリオでは、アプリケーション開発者は、.NET ランタイムおよびフレームワーク ライブラリがクライアント コンピューターで利用できることを見込んで、アプリケーションとサードパーティのアセンブリのみをバンドルします。 このデプロイ モデルは .NET Core でも引き続き主に使用されますが、フレームワークに依存するモデルが最適ではないシナリオもあります。 別の方法としては、自己完結型アプリケーションを発行します。この場合、.NET Core ランタイムおよびフレームワークは、アプリケーションとサードパーティのアセンブリと共にバンドルされます。

トリミング自己完結型のデプロイ モデルは、展開のサイズを小さくするために最適化された、自己完結型のデプロイ モデルの特殊なバージョンです。 展開のサイズを最小限に抑えることは、Blazor アプリケーションなどの一部のクライアント側のシナリオでは重要な要件です。 アプリケーションの複雑さによっては、アプリケーションを実行するために、フレームワーク アセンブリのサブセットのみが参照され、各アセンブリ内のコードのサブセットのみが必要となります。 ライブラリの未使用部分は不要であり、パッケージ化されたアプリケーションから削除することができます。

ただし、アプリケーションのビルド時分析によってランタイム エラーが発生しうるというリスクがあります。これは、問題のあるさまざまなコード パターンを確実に分析できないためです (ほとんどの場合、リフレクション使用が中心となります)。 信頼性を保証できないため、このデプロイ モデルはプレビュー機能として提供されます。

ビルド時分析エンジンによって、問題のあるコード パターンの開発者に対して、必要な他のコードを検出するように警告が与えられます。 コードには、他に含めるものをトリマーに指示する属性を使用して注釈が付けられます。 多くのリフレクション パターンは、ソース ジェネレーターを使用して、ビルド時コード生成に置き換えることができます。

アプリケーションのトリミング モードは、TrimMode 設定で構成されます。 既定値は copyused で、参照されるアセンブリがアプリケーションとバンドルされます。 Blazor WebAssembly では、link 値が使用され、アセンブリ内の使用されていないコードがトリミングされます。 トリミング分析の警告により、完全な依存関係分析が不可能なコード パターンに関する情報が示されます。 これらの警告は、既定では非表示となり、フラグ SuppressTrimAnalysisWarningsfalse に設定することで有効にすることができます。 使用可能なトリミング オプションの詳細については、「トリミング オプション」を参照してください。

注意

トリミングは、.NET Core 3.1 および .NET 5.0 の実験的な機能です。 トリミングは、自己完結型で公開されるアプリケーション "のみ" で使用できます。

アセンブリがトリミングされないようにする

トリミング機能が参照の検出に失敗するシナリオがあります。 たとえば、アプリケーションまたはアプリケーションによって参照されるライブラリから、ランタイム アセンブリに対してリフレクションが使用されている場合、アセンブリは直接参照されません。 このような間接参照はトリミングに認識されず、ライブラリは発行フォルダーから除外されます。

コードからリフレクションを介して間接的にアセンブリを参照している場合は、<TrimmerRootAssembly> 設定を使用してアセンブリがトリミングされないようにすることができます。 次の例は、System.Security アセンブリという名前のアセンブリがトリミングされないようにする方法を示しています。

<ItemGroup>
    <TrimmerRootAssembly Include="System.Security" />
</ItemGroup>

SSL 証明書のサポート

ASP.NET Core アプリなどのお使いのアプリで SSL 証明書が読み込まれる場合、トリミング時に、SSL 証明書の読み込みを支援するトリミング アセンブリが確実に使用されないようにする必要があります。

ASP.NET Core 3.1 では、次を含むようにプロジェクト ファイルを更新します。

<Project Sdk="Microsoft.NET.Sdk.Web">
  <PropertyGroup>...</PropertyGroup>
  <!--Include the following for .aspnetcore 3.1-->
  <ItemGroup>
    <TrimmerRootAssembly Include="System.Net" />
    <TrimmerRootAssembly Include="System.Net.Security" />
    <TrimmerRootAssembly Include="System.Security" />
  </ItemGroup>
  ...
</Project>

.Net 5.0 を使用している場合は、次を含むようにプロジェクト ファイルを更新します。

<Project Sdk="Microsoft.NET.Sdk.Web">
 <PropertyGroup>...</PropertyGroup>
 <!--Include the following for .net 5.0-->
 <ItemGroup>
    <TrimmerRootAssembly Include="System.Net.Security" />
    <TrimmerRootAssembly Include="System.Security" />
  </ItemGroup>
  ...
</Project>

アプリをトリミングする - CLI

dotnet publish コマンドを使用してアプリケーションをトリミングします。 アプリを発行する場合、次のプロパティを設定します。

  • 特定のランタイムの自己完結型アプリとして発行する: -r win-x64
  • トリミングを有効にする: /p:PublishTrimmed=true

次の例では、Windows 用のアプリを自己完結型として発行し、出力をトリミングします。

<PropertyGroup>
    <RuntimeIdentifier>win-x64</RuntimeIdentifier>
    <PublishTrimmed>true</PublishTrimmed>
</PropertyGroup>

次の例では、アグレッシブなトリミング モードでアプリを発行します。このモードでは、アセンブリ内の使用されていないコードがトリミングされ、トリマー警告が有効になります。

<PropertyGroup>
    <RuntimeIdentifier>win-x64</RuntimeIdentifier>
    <PublishTrimmed>true</PublishTrimmed>
    <TrimMode>link</TrimMode>
    <SuppressTrimAnalysisWarnings>false</SuppressTrimAnalysisWarnings>
</PropertyGroup>

詳細については、「.NET Core CLI を使用して .NET Core アプリを発行する」を参照してください。

アプリをトリミングする - Visual Studio

Visual Studio を使用すると、アプリケーションの発行方法を制御する再利用可能な発行プロファイルを作成できます。

  1. [ソリューション エクスプローラー] ペインで、発行するプロジェクトを右クリックします。 [発行] を選択します。

    右クリック メニューの [発行] オプションが強調表示されたソリューション エクスプローラー。

    発行プロファイルがまだない場合は、指示に従って作成し、ターゲットの種類として [フォルダー] を選択します。

  2. [編集] を選択します。

    Visual Studio の発行プロファイルと [編集] ボタン

  3. [プロファイル設定] ダイアログで、次のオプションを設定します。

    • [配置モード][自己完結] に設定します。
    • [ターゲット ランタイム] を発行先のプラットフォームに設定します。
    • [未使用のアセンブリをトリミングする (プレビュー)] を選択します。

    [保存] を選択して設定を保存し、 [発行] ダイアログに戻ります。

    [配置モード]、[ターゲット ランタイム]、[未使用のアセンブリをトリミングする] オプションが強調表示されている [プロファイル設定] ダイアログ。

  4. [発行] を選択してトリミングされたアプリを発行します。

詳細については、Visual Studio を使用した .NET Core アプリの発行に関するページを参照してください。

アプリをトリミングする - Visual Studio for Mac

Visual Studio for Mac には、発行時にアプリをトリミングするオプションがありません。 「アプリをトリミングする - CLI」セクションの手順に従って手動で発行する必要があります。 詳細については、「.NET Core CLI を使用して .NET Core アプリを発行する」を参照してください。

関連項目