リソース マニフェスト ファイルの名前付け方法

MSBuild により .NET Core プロジェクトがコンパイルされると、 .resx ファイル拡張子を持つ XML リソース ファイルがバイナリ .resources ファイルに変換されます。 バイナリ ファイルは、コンパイラの出力に埋め込まれ、ResourceManager で読み取ることができます。 この記事では、MSBuild によって各 .resources ファイルの名前がどのように選択されるかについて説明します。

ヒント

リソース項目をプロジェクト ファイルに明示的に追加するときに、それが .NET Core の既定の include glob にも含まれる場合、ビルド エラーが発生します。 リソース ファイルを EmbeddedResource 項目として手動で含めるには、EnableDefaultEmbeddedResourceItems プロパティを false に設定します。

既定名

.NET Core 3.0 以降では、次の両方の条件が満たされる場合に、リソース マニフェストの既定名が使用されます。

  • リソース ファイルが、LogicalNameManifestResourceName、または DependentUpon メタデータを持つ EmbeddedResource 項目としてプロジェクト ファイルに明示的に含まれていない。
  • EmbeddedResourceUseDependentUponConvention プロパティがプロジェクト ファイルで false に設定されていない。 既定では、このプロパティは trueに設定されています。 詳細については、「EmbeddedResourceUseDependentUponConvention」を参照してください。

リソース ファイルが、同じルート ファイル名のソース ファイル ( .cs または .vb) と併置されている場合、ソース ファイルで定義されている最初の型の完全な名前がマニフェスト ファイル名に使用されます。 たとえば、MyNamespace.Form1Form1.cs で定義されている最初の型であり、Form1.csForm1.resx と併置されている場合、そのリソース ファイルに対して生成されたマニフェスト名は MyNamespace.Form1.resources となります。

LogicalName メタデータ

リソース ファイルが LogicalName メタデータを持つ EmbeddedResource 項目としてプロジェクト ファイルに明示的に含まれている場合、LogicalName 値がマニフェスト名として使用されます。 LogicalName は、他のメタデータや設定よりも優先されます。

たとえば、次のプロジェクト ファイル スニペットで定義されているリソース ファイルのマニフェスト名は、SomeName.resources となります。

<EmbeddedResource Include="X.resx" LogicalName="SomeName.resources" />

または

<EmbeddedResource Include="X.fr-FR.resx" LogicalName="SomeName.resources" />

注意

  • LogicalName が指定されていない場合、ファイル名に 2 つのドット (.) がある EmbeddedResource は機能しません。つまり、GetManifestResourceNames からそのファイルは返されないということです。

    次の例は正常に機能します。

    <EmbeddedResource Include="X.resx" />
    

    次の例は機能しません。

    <EmbeddedResource Include="X.fr-FR.resx" />
    

ManifestResourceName メタデータ

リソース ファイルが ManifestResourceName メタデータを持つ (LogicalName は存在しない)EmbeddedResource 項目としてプロジェクト ファイルに明示的に含まれている場合、ManifestResourceName 値は、ファイル拡張子 .resources と組み合わされ、マニフェスト ファイル名として使用されます。

たとえば、次のプロジェクト ファイル スニペットで定義されているリソース ファイルのマニフェスト名は、SomeName.resources となります。

<EmbeddedResource Include="X.resx" ManifestResourceName="SomeName" />

次のプロジェクト ファイル スニペットで定義されているリソース ファイルのマニフェスト名は、SomeName.fr-FR.resources となります。

<EmbeddedResource Include="X.fr-FR.resx" ManifestResourceName="SomeName.fr-FR" />

DependentUpon メタデータ

リソース ファイルが DependentUpon メタデータを持つ (LogicalNameManifestResourceName は存在しない) EmbeddedResource 項目としてプロジェクト ファイルに明示的に含まれている場合、DependentUpon で定義されているソース ファイルからの情報がリソース マニフェストのファイル名に使用されます。 具体的には、ソース ファイルで定義されている最初の型の名前がマニフェスト名で次のように使用されます: Namespace.Classname[.Culture].resources

たとえば、次のプロジェクト ファイル スニペットで定義されているリソース ファイルのマニフェスト名は、Namespace.Classname.resources となります (ここで、Namespace.ClassnameMyTypes.cs で定義されている最初のクラスです)。

<EmbeddedResource Include="X.resx" DependentUpon="MyTypes.cs">

次のプロジェクト ファイル スニペットで定義されているリソース ファイルのマニフェスト名は Namespace.Classname.fr-FR.resources となります (ここで、Namespace.ClassnameMyTypes.cs で定義されている最初のクラスです)。

<EmbeddedResource Include="X.fr-FR.resx" DependentUpon="MyTypes.cs">

EmbeddedResourceUseDependentUponConvention プロパティ

プロジェクト ファイルで EmbeddedResourceUseDependentUponConventionfalse に設定されている場合、各リソース マニフェストのファイル名は、プロジェクトのルート名前空間と、プロジェクト ルートから .resx ファイルへの相対パスに基づきます。 より具体的には、生成されるリソース マニフェストのファイル名は RootNamespace.RelativePathWithDotsForSlashes.[Culture.]resources となります。 これは、3.0 より前の .NET Core バージョンでマニフェスト名を生成するために使用されるロジックでもあります。

注意

  • RootNamespace が定義されていない場合は、既定でそのプロジェクト名になります。
  • LogicalNameManifestResourceName、または DependentUpon メタデータがプロジェクト ファイルで EmbeddedResource 項目に対して指定されている場合、この名前付けルールはそのリソース ファイルには適用されません。

関連項目