0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

.NET プロジェクトにおけるサテライト アセンブリの生成ディレクトリに出現する条件および解決策

Posted at

出現条件

参照または間接参照されるプログラム アセンブリにEmbeddedResourceが存在すること。

  1. EmbeddedResourceのリソース形式がa.jsona.zh.jsonのようにファイル+言語識別子+拡張子であること。

  2. WithCultureが設定されておらず、デフォルトでtrueであること。

  3. NuGetパッケージを通じて渡されるサテライト アセンブリ。

  • Console1.csproj
<Project Sdk="Microsoft.NET.Sdk">

	<PropertyGroup>
		<OutputType>Exe</OutputType>
		<TargetFramework>net5.0</TargetFramework>
	</PropertyGroup>

	<ItemGroup>
	  <EmbeddedResource Include="a.json" />
	  <EmbeddedResource Include="a.zh.json" />
	</ItemGroup>

</Project>
  • プロジェクトのパス構造
ConsoleApp1/
    a.json
    a.zh.json
    ConsoleApp1.csproj
  • 生成されたパス構造
net5.0/
    zh/ConsoleApp1.resources.dll
    ConsoleApp1.dll

解決策1:EmbeddedResourceWithCulture="false"を設定します

  • Console1.csproj (変更後)
<Project Sdk="Microsoft.NET.Sdk">

	<PropertyGroup>
		<OutputType>Exe</OutputType>
		<TargetFramework>net5.0</TargetFramework>
	</PropertyGroup>

	<ItemGroup>
	  <EmbeddedResource Include="a.json" />
	  <EmbeddedResource Include="a.zh.json" />
	</ItemGroup>

	<ItemGroup>
		<EmbeddedResource Update="**\*" WithCulture="false" />
	</ItemGroup>

</Project>

解決策2: プロジェクトの参照に対してResolveAssemblyReferencesFindRelatedSatellitesfalseに設定します

  • ConsoleApp2.csproj
<Project Sdk="Microsoft.NET.Sdk">

	<PropertyGroup>
		<OutputType>Exe</OutputType>
		<TargetFramework>net5.0</TargetFramework>
		<ResolveAssemblyReferencesFindRelatedSatellites>false</ResolveAssemblyReferencesFindRelatedSatellites>
	</PropertyGroup>

	<ItemGroup>
		<ProjectReference Include="..\ConsoleApp1\ConsoleApp1.csproj" />
	</ItemGroup>

</Project>

解決策3:NuGetパッケージに対してSatelliteResourceLanguagesを無効値に設定します

  • Console3.csproj
<Project Sdk="Microsoft.NET.Sdk">

	<PropertyGroup>
		<OutputType>Exe</OutputType>
		<TargetFramework>net5.0</TargetFramework>
		<SatelliteResourceLanguages>_</SatelliteResourceLanguages>
	</PropertyGroup>

	<ItemGroup>
		<PackageReference Include="Microsoft.CodeAnalysis" Version="3.9.0" />
	</ItemGroup>

</Project>

まとめ

今回は、.NETプロジェクトでサテライトアセンブリが生成される条件と解決策について紹介しました。

EmbeddedResourceを使用するアセンブリを参照または間接的に参照している場合に、サテライトアセンブリが生成されます。生成条件は以下の通りです。

  1. EmbeddedResourceのフォーマットがa.jsona.zh.jsonのように、ファイル名に言語識別子が含まれている場合。
  2. WithCultureが設定されていない場合、デフォルトでtrueとなります。
  3. NuGetパッケージによってサテライトアセンブリが渡された場合。
  • 解決策は以下の通りです。
  1. EmbeddedResourceに対して、現在のアセンブリに対してWithCulture="false"を設定します。
  2. プロジェクト参照の場合は、ResolveAssemblyReferencesFindRelatedSatellitesfalseに設定します。
  3. NuGetパッケージに対しては、SatelliteResourceLanguagesを無効な値に設定します。

これらの手順を実行することで、不要なサテライトアセンブリの生成を回避することができます。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?