はじめに
C#でアプリケーションを開発中、ビルドをすると、不要な言語フォルダおよびアセンブリファイルが出力される問題に遭遇しました。
その解消を行った備忘録です。
環境
- アプリケーションのターゲットフレームワーク:.NET6
- 開発ツール:Visual Studio 2022
問題の詳細
使用しているNuGetパッケージのバージョンを上げたところ、本現象が発生しました。
今回en
フォルダは英語リソースを作成しているため必要なのですが、以下の画像のように、不要なその他の言語のフォルダが出力されました。
また、各フォルダには、以下のファイルが出力されていました。
System.Private.ServiceModel.resources.dll
そのため、ライブラリで参照しているNuGetパッケージ(System.Private.ServiceModel)で、ローカライゼーションを有効にしたのが原因のようです。
解消方法
以下を参照すると、リソースのサテライトアセンブリを含むNuGetパッケージを参照するプロジェクトにおいて、SatelliteResourceLanguages
プロパティに言語を指定することで、必要な言語のサテライトアセンブリのみを出力できるようになるようです。
多くの NuGet パッケージには、ローカライズされたリソースのサテライト・アセンブリがメイン・パッケージに含まれています。ローカライズされたリソースを必要としないこれらの NuGet パッケージを参照するプロジェクトでは、ローカライズされたアセンブリによってビルドとパブリッシュの出力サイズが不必要に増大する可能性があります。プロジェクト・ファイルに SatelliteResourceLanguages プロパティを追加すると、指定した言語のローカライズされたアセンブリのみがビルドおよびパブリッシュ出力に含まれるようになります。
以下のように、プロジェクトファイルで出力したい言語をSatelliteResourceLanguages
プロパティに指定します。
この場合、en
が指定されていますので、英語の言語フォルダおよびリソースファイルのみが出力されるようになります。また、;
区切りで複数言語を指定できます。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<SatelliteResourceLanguages>en</SatelliteResourceLanguages>
</PropertyGroup>
...
</Project>
サテライトアセンブリが無い場合は、言語でない無効な文字列を指定すると、出力されなくなります。
<PropertyGroup>
<SatelliteResourceLanguages>_</SatelliteResourceLanguages>
</PropertyGroup>
以下のように、SatelliteResourceLanguages
に何も指定が無いと、すべての言語フォルダが出力されます。
<PropertyGroup>
<SatelliteResourceLanguages></SatelliteResourceLanguages>
</PropertyGroup>
さいごに
簡単なプロジェクトの設定で解消できてよかったです。