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 MetadatenLogicalName
,ManifestResourceName
oderDependentUpon
enthalten. - Die
EmbeddedResourceUseDependentUponConvention
-Eigenschaft ist in der Projektdatei nicht auffalse
festgelegt. Standardmäßig ist diese Eigenschaft auftrue
festgelegt. 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 eineEmbeddedResource
mit zwei Punkten (.
) im Dateinamen nicht, was bedeutet, dassGetManifestResourceNames
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
- oderDependentUpon
-Metadaten für einEmbeddedResource
-Element in der Projektdatei angegeben werden, gilt diese Benennungsregel nicht für diese Ressourcendatei.