出現条件
参照または間接参照されるプログラム アセンブリにEmbeddedResource
が存在すること。
-
EmbeddedResource
のリソース形式がa.json
、a.zh.json
のようにファイル名
+言語識別子
+拡張子
であること。 -
WithCulture
が設定されておらず、デフォルトでtrue
であること。 -
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:EmbeddedResource
でWithCulture="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: プロジェクトの参照に対してResolveAssemblyReferencesFindRelatedSatellites
をfalse
に設定します
- 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
を使用するアセンブリを参照または間接的に参照している場合に、サテライトアセンブリが生成されます。生成条件は以下の通りです。
-
EmbeddedResource
のフォーマットがa.json
、a.zh.json
のように、ファイル名に言語識別子が含まれている場合。 -
WithCulture
が設定されていない場合、デフォルトでtrue
となります。 -
NuGet
パッケージによってサテライトアセンブリが渡された場合。
- 解決策は以下の通りです。
-
EmbeddedResource
に対して、現在のアセンブリに対してWithCulture="false"
を設定します。 - プロジェクト参照の場合は、
ResolveAssemblyReferencesFindRelatedSatellites
をfalse
に設定します。 -
NuGet
パッケージに対しては、SatelliteResourceLanguages
を無効な値に設定します。
これらの手順を実行することで、不要なサテライトアセンブリの生成を回避することができます。