Benennen von Manifestdateien von Ressourcen

Wenn MSBuild ein .NET Core-Projekt kompiliert, werden XML-Ressourcendateien mit der Dateierweiterung .resx in .resources-Binärdateien konvertiert. Die Binärdateien werden in die Ausgabe des Compilers eingebettet und können vom ResourceManager gelesen werden. In diesem Artikel wird beschrieben, wie MSBuild die Namen für die jeweiligen .resources-Dateien auswählt.

Tipp

Wenn Sie der Projektdatei explizit ein Ressourcenelement hinzufügen und dieses auch in den standardmäßigen Include-Globs für .NET Core enthalten ist, erhalten Sie einen Buildfehler. Um Ressourcendateien manuell als EmbeddedResource-Elemente einzubeziehen, legen Sie die EnableDefaultEmbeddedResourceItems-Eigenschaft auf „false“ fest.

Standardname

In .NET Core 3.0 und höher wird für ein Ressourcenmanifest der Standardname verwendet, wenn die beiden folgenden Bedingungen erfüllt sind:

  • Die Ressourcendatei ist nicht explizit in der Projektdatei als EmbeddedResource-Element mit den Metadaten LogicalName, ManifestResourceName oder DependentUpon enthalten.
  • Die EmbeddedResourceUseDependentUponConvention-Eigenschaft ist in der Projektdatei nicht auf false festgelegt. Standardmäßig ist diese Eigenschaft auf truefestgelegt. Weitere Informationen finden Sie unter EmbeddedResourceUseDependentUponConvention.

Wenn die Ressourcendatei mit einer Quelldatei ( .cs oder .vb) desselben Stammdateinamens zusammengestellt wird, wird der vollständige Name des ersten Typs, der in der Quelldatei definiert ist, als Manifestdateiname verwendet. Wenn beispielsweise MyNamespace.Form1 der erste Typ ist, der in der Form1.cs-Datei definiert ist, und Form1.cs mit Form1.resx angeordnet ist, lautet der generierte Manifestname für diese Ressourcendatei MyNamespace.Form1.resources.

LogicalName-Metadaten

Wenn eine Ressourcendatei explizit in der Projektdatei als EmbeddedResource-Element mit LogicalName-Metadaten enthalten ist, wird der LogicalName-Wert als Manifestname verwendet. LogicalName hat Vorrang vor anderen Metadaten oder Einstellungen.

Beispielsweise lautet der Manifestname für die Ressourcendatei, die im folgenden Projektdateiausschnitt definiert ist, SomeName.resources.

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

Oder

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

Hinweis

  • Wenn LogicalName nicht angegeben wird, funktioniert eine EmbeddedResource mit zwei Punkten ( .) im Dateinamen nicht, was bedeutet, dass GetManifestResourceNames diese Datei nicht zurückgibt.

    Das folgende Beispiel funktioniert ordnungsgemäß:

    <EmbeddedResource Include="X.resx" />
    

    Das folgende Beispiel funktioniert nicht:

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

ManifestResourceName-Metadaten

Wenn eine Ressourcendatei explizit in der Projektdatei als EmbeddedResource-Element mit ManifestResourceName-Metadaten enthalten ist (und LogicalName fehlt), wird als Manifestdateiname der ManifestResourceName-Wert in Kombination mit der Dateierweiterung .resources verwendet.

Beispielsweise lautet der Manifestname für die Ressourcendatei, die im folgenden Projektdateiausschnitt definiert ist, SomeName.resources.

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

Der Manifestname für die Ressourcendatei, die im folgenden Projektdateiausschnitt definiert ist, lautet SomeName.resources.

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

DependentUpon-Metadaten

Wenn eine Ressourcendatei explizit in der Projektdatei als EmbeddedResource-Element mit DependentUpon-Metadaten enthalten ist (und sowohl LogicalName als auch ManifestResourceName fehlen), werden Informationen aus der Quelldatei, die von DependentUpon definiert werden, für den Dateinamen des Ressourcenmanifests verwendet. Genauer gesagt wird der Name des ersten Typs, der in der Quelldatei definiert ist, wie folgt im Manifestnamen verwendet: Namespace.Classname[.Culture].resources.

Beispielsweise lautet der Manifestname für die Ressourcendatei, die im folgenden Projektdateiausschnitt definiert ist, Namespace.Classname.resources (wobei Namespace.Classname die erste Klasse ist, die in MyTypes.cs definiert ist).

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

Der Manifestname für die Ressourcendatei, die im folgenden Projektdateiausschnitt definiert ist, lautet Namespace.Classname.fr-FR.resources (wobei Namespace.Classname die erste Klasse ist, die in MyTypes.csdefiniert ist).

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

EmbeddedResourceUseDependentUponConvention-Eigenschaft

Wenn EmbeddedResourceUseDependentUponConvention auf false in der Projektdatei festgelegt ist, basieren die Manifestdateinamen der jeweiligen Ressourcen auf dem Stammnamespace für das Projekt und auf dem relativen Pfad vom Projektstamm zur .resx-Datei. Genauer gesagt lautet der Name der generierten Manifestdatei der Ressource RootNamespace.RelativePathWithDotsForSlashes.[Culture.]resources. Diese Logik wird auch verwendet, um Manifestnamen in .NET Core-Versionen vor 3.0 zu generieren.

Hinweis

  • Wenn RootNamespace nicht definiert ist, wird standardmäßig der Projektname verwendet.
  • Wenn LogicalName-, ManifestResourceName- oder DependentUpon-Metadaten für ein EmbeddedResource-Element in der Projektdatei angegeben werden, gilt diese Benennungsregel nicht für diese Ressourcendatei.

Siehe auch