未使用のを取り除く方法.の内容を読み込みからDLL


背景


クラスライブラリプロジェクトがBlazor WebSsemblyアプリケーションプロジェクトから参照されるシナリオを想像してください.

そして、このシナリオでは、クラスライブラリから公開されたすべての型は、何らかの理由でリリースビルドのBlazorアプリでは使用されません.
(条件付きコンパイルによって制御される可能性があります.
この場合、多分クラスライブラリを期待します.DLLファイルは“イルリンカ”の機能をトリミングして“リリース”の設定で公開されたBlazorアプリにロードされません.
しかし、予想外に、クラスライブラリ.DLLファイルはどこにでも使用されていませんが、ブラウザに読み込まれます.😱

解決策


未使用クラスライブラリの読み込みを避けるためのソリューションです.ファイルを追加するにはAssemblyMetadata("IsTrimmable", "True") クラスライブラリのコードをアセンブリレベルとして属性.
// This code should be added somewhere .cs files in the class library.
[assembly: System.Reflection.AssemblyMetadata("IsTrimmable", "True")]
その後、ブラウザはクラスライブラリを読み込みません.DLLファイルは、クラスライブラリがどこにも使用されていない場合.🎉

フォー.ネット5


残念ながらAssemblyMetadata("IsTrimmable", "True") 属性は全く影響しません.NET 5プラットフォーム.
解決策このシナリオのNET 5プラットフォームでは、このようにBlazor WebSassMetアプリケーションのプロジェクトファイル内にMSBuildスクリプトの一部を追加することです.
<!-- This is a .csproj file of a Blazor WebAssembly app, not a class library.  -->
<Project Sdk="Microsoft.NET.Sdk.BlazorWebAssembly">
  ...
  <Target Name="_ConfigureAssemblyLevelTrimming" BeforeTargets="PrepareForILLink">
    <ItemGroup>
      <ManagedAssemblyToLink Condition="'%(Filename)' == 'SampleLib'">
        <IsTrimmable>true</IsTrimmable>
      </ManagedAssemblyToLink>
    </ItemGroup>
  </Target>
  ...
クラスライブラリがNUGETパッケージとしてパックされる場合、上記のようなMSBuildスクリプトもNuGetパッケージファイルに含まれ、パッケージを参照するプロジェクトに自動的にインポートされるように構成されます.
これはプラットフォームより簡単な方法ではありません.ネット6またはそれ以降の方法はありません.NET 5プラットフォーム.
そして覚えておいてください.NET 5は2022年5月8日になります.

公文書


詳細については、マイクロソフトの公式文書サイトをご覧ください.
📄 "Trim additional assemblies | Microsoft Docs"
公式文書について<TrimmableAssembly/> MSBuildアイテムも.
しかし、この記事では、私はそれに言及しない<TrimmableAssembly/> MSBuildアイテムはあまり重要ではありません.