LoginSignup
23
24

[C#][備忘録]ビルド時に不要な言語フォルダが出力されないように設定する

Last updated at Posted at 2023-07-31

はじめに

C#でアプリケーションを開発中、ビルドをすると、不要な言語フォルダおよびアセンブリファイルが出力される問題に遭遇しました。
その解消を行った備忘録です。

環境

  • アプリケーションのターゲットフレームワーク:.NET6
  • 開発ツール:Visual Studio 2022

問題の詳細

使用しているNuGetパッケージのバージョンを上げたところ、本現象が発生しました。
今回enフォルダは英語リソースを作成しているため必要なのですが、以下の画像のように、不要なその他の言語のフォルダが出力されました。
image.png

また、各フォルダには、以下のファイルが出力されていました。
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>

さいごに

簡単なプロジェクトの設定で解消できてよかったです。

23
24
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
23
24