Events
17 Mar, 9 pm - 21 Mar, 10 am
Join the meetup series to build scalable AI solutions based on real-world use cases with fellow developers and experts.
Register nowThis browser is no longer supported.
Upgrade to Microsoft Edge to take advantage of the latest features, security updates, and technical support.
When MSBuild compiles a .NET Core project, XML resource files, which have the .resx file extension, are converted into binary .resources files. The binary files are embedded into the output of the compiler and can be read by the ResourceManager. This article describes how MSBuild chooses a name for each .resources file.
Tip
If you explicitly add a resource item to your project file, and it's also included with the default include globs for .NET Core, you will get a build error. To manually include resource files as EmbeddedResource
items, set the EnableDefaultEmbeddedResourceItems
property to false.
In .NET Core 3.0 and later, the default name for a resource manifest is used when both of the following conditions are met:
EmbeddedResource
item with LogicalName
, ManifestResourceName
, or DependentUpon
metadata.EmbeddedResourceUseDependentUponConvention
property is not set to false
in the project file. By default, this property is set to true
. For more information, see EmbeddedResourceUseDependentUponConvention.If the resource file is colocated with a source file (.cs or .vb) of the same root file name, the full name of the first type that's defined in the source file is used for the manifest file name. For example, if MyNamespace.Form1
is the first type defined in Form1.cs, and Form1.cs is colocated with Form1.resx, the generated manifest name for that resource file is MyNamespace.Form1.resources.
If a resource file is explicitly included in the project file as an EmbeddedResource
item with LogicalName
metadata, the LogicalName
value is used as the manifest name. LogicalName
takes precedence over any other metadata or setting.
For example, the manifest name for the resource file that's defined in the following project file snippet is SomeName.resources.
<EmbeddedResource Include="X.resx" LogicalName="SomeName.resources" />
-or-
<EmbeddedResource Include="X.fr-FR.resx" LogicalName="SomeName.resources" />
Note
If LogicalName
is not specified, an EmbeddedResource
with two dots (.
) in the file name doesn't work, which means that GetManifestResourceNames
doesn't return that file.
The following example works correctly:
<EmbeddedResource Include="X.resx" />
The following example doesn't work:
<EmbeddedResource Include="X.fr-FR.resx" />
If a resource file is explicitly included in the project file as an EmbeddedResource
item with ManifestResourceName
metadata (and LogicalName
is absent), the ManifestResourceName
value, combined with the file extension .resources, is used as the manifest file name.
For example, the manifest name for the resource file that's defined in the following project file snippet is SomeName.resources.
<EmbeddedResource Include="X.resx" ManifestResourceName="SomeName" />
The manifest name for the resource file that's defined in the following project file snippet is SomeName.fr-FR.resources.
<EmbeddedResource Include="X.fr-FR.resx" ManifestResourceName="SomeName.fr-FR" />
If a resource file is explicitly included in the project file as an EmbeddedResource
item with DependentUpon
metadata (and LogicalName
and ManifestResourceName
are absent), information from the source file defined by DependentUpon
is used for the resource manifest file name. Specifically, the name of the first type that's defined in the source file is used in the manifest name as follows: Namespace.Classname[.Culture].resources.
For example, the manifest name for the resource file that's defined in the following project file snippet is Namespace.Classname.resources (where Namespace.Classname
is the first class that's defined in MyTypes.cs).
<EmbeddedResource Include="X.resx" DependentUpon="MyTypes.cs">
The manifest name for the resource file that's defined in the following project file snippet is Namespace.Classname.fr-FR.resources (where Namespace.Classname
is the first class that's defined in MyTypes.cs).
<EmbeddedResource Include="X.fr-FR.resx" DependentUpon="MyTypes.cs">
If EmbeddedResourceUseDependentUponConvention
is set to false
in the project file, each resource manifest file name is based off the root namespace for the project and the relative path from the project root to the .resx file. More specifically, the generated resource manifest file name is RootNamespace.RelativePathWithDotsForSlashes.[Culture.]resources. This is also the logic used to generate manifest names in .NET Core versions prior to 3.0.
Note
RootNamespace
is not defined, it defaults to the project name.LogicalName
, ManifestResourceName
, or DependentUpon
metadata is specified for an EmbeddedResource
item in the project file, this naming rule does not apply to that resource file..NET feedback
.NET is an open source project. Select a link to provide feedback:
Events
17 Mar, 9 pm - 21 Mar, 10 am
Join the meetup series to build scalable AI solutions based on real-world use cases with fellow developers and experts.
Register nowTraining
Module
Design consistent .NET MAUI XAML pages by using shared resources - Training
Learn how to use static and dynamic shared resources to build a .NET Multi-platform App UI (MAUI) user interface. And see how styles can make the user interface both consistent and accessible.