Como os arquivos de manifesto de recurso são nomeados
Quando o MSBuild compila um projeto do .NET Core, os arquivos de recursos XML, que têm a extensão de arquivo .resx, são convertidos em arquivos .resources binários. Os arquivos binários são inseridos na saída do compilador e podem ser lidos pelo ResourceManager. Este artigo descreve como o MSBuild escolhe um nome para cada arquivo .resources.
Dica
Se você adicionar explicitamente um item de recurso ao arquivo de projeto e ele também estiver incluído com os globs de inclusão padrão do .NET Core, haverá um erro de build. Para incluir manualmente os arquivos de recurso como itens EmbeddedResource
, defina a propriedade EnableDefaultEmbeddedResourceItems
como false.
Nome padrão
No .NET Core 3.0 e posteriores, o nome padrão de um manifesto de recurso é usado quando estas duas condições são atendidas:
- O arquivo de recurso não está explicitamente incluído no arquivo de projeto como um item
EmbeddedResource
com os metadadosLogicalName
,ManifestResourceName
ouDependentUpon
. - A propriedade
EmbeddedResourceUseDependentUponConvention
não está definida comofalse
no arquivo de projeto. Por padrão, essa propriedade é definida comotrue
. Para obter mais informações, confira EmbeddedResourceUseDependentUponConvention.
Se o arquivo de recurso for colocado com um arquivo de origem (.cs ou .vb) do mesmo nome de arquivo raiz, o nome completo do primeiro tipo definido no arquivo de origem será usado para o nome do arquivo de manifesto. Por exemplo, se MyNamespace.Form1
for o primeiro tipo definido em Form1.cs e Form1.cs for colocado com Form1.resx, o nome do manifesto gerado para esse arquivo de recurso será MyNamespace.Form1.resources.
Metadados LogicalName
Se um arquivo de recurso for incluído explicitamente no arquivo de projeto como um item EmbeddedResource
com metadados LogicalName
, o valor de LogicalName
será usado como o nome do manifesto. LogicalName
tem precedência sobre outros metadados ou configurações.
Por exemplo, o nome do manifesto do arquivo de recurso definido no snippet de arquivo de projeto a seguir é SomeName.resources.
<EmbeddedResource Include="X.resx" LogicalName="SomeName.resources" />
-ou-
<EmbeddedResource Include="X.fr-FR.resx" LogicalName="SomeName.resources" />
Observação
Se
LogicalName
não for especificado, umEmbeddedResource
com dois pontos (.
) no nome do arquivo não funcionará, o que significa queGetManifestResourceNames
não retornará esse arquivo.O seguinte exemplo funciona corretamente:
<EmbeddedResource Include="X.resx" />
O seguinte exemplo não funciona:
<EmbeddedResource Include="X.fr-FR.resx" />
Metadados ManifestResourceName
Se um arquivo de recurso for incluído explicitamente no arquivo de projeto como um item EmbeddedResource
com metadados ManifestResourceName
(e LogicalName
estiver ausente), o valor de ManifestResourceName
, combinado com a extensão de arquivo .resources, será usado como o nome do arquivo de manifesto.
Por exemplo, o nome do manifesto do arquivo de recurso definido no snippet de arquivo de projeto a seguir é SomeName.resources.
<EmbeddedResource Include="X.resx" ManifestResourceName="SomeName" />
O nome do manifesto do arquivo de recurso definido no snippet de arquivo de projeto a seguir é SomeName.fr-FR.resources.
<EmbeddedResource Include="X.fr-FR.resx" ManifestResourceName="SomeName.fr-FR" />
Metadados DependentUpon
Se um arquivo de recurso for incluído explicitamente no arquivo de projeto como um item EmbeddedResource
com metadados DependentUpon
(e LogicalName
e ManifestResourceName
estiverem ausentes), as informações do arquivo de origem definidas por DependentUpon
serão usadas para o nome do arquivo de manifesto do recurso. O nome do primeiro tipo definido no arquivo de origem é usado no nome do manifesto da seguinte maneira : Namespace.Classname[.Culture].resources.
Por exemplo, o nome do manifesto do arquivo de recurso definido no snippet de arquivo de projeto a seguir é Namespace.Classname.resources (em que Namespace.Classname
é a primeira classe definida em MyTypes.cs).
<EmbeddedResource Include="X.resx" DependentUpon="MyTypes.cs">
Por exemplo, o nome do manifesto do arquivo de recurso definido no snippet de arquivo de projeto a seguir é Namespace.Classname.fr-FR.resources (em que Namespace.Classname
é a primeira classe definida em MyTypes.cs).
<EmbeddedResource Include="X.fr-FR.resx" DependentUpon="MyTypes.cs">
Propriedade EmbeddedResourceUseDependentUponConvention
Se EmbeddedResourceUseDependentUponConvention
estiver definido como false
no arquivo de projeto, cada nome de arquivo de manifesto de recurso será baseado no namespace raiz do projeto e no caminho relativo da raiz do projeto para o arquivo .resx. Especificamente, o nome do arquivo de manifesto de recurso gerado é RootNamespace.RelativePathWithDotsForSlashes.[Culture.]resources. Essa também é a lógica usada para gerar nomes de manifesto em versões do .NET Core anteriores à 3.0.
Observação
- Se
RootNamespace
não estiver definido, o padrão será o nome do projeto. - Se os metadados
LogicalName
,ManifestResourceName
ouDependentUpon
forem especificados para um itemEmbeddedResource
no arquivo de projeto, essa regra de nomenclatura não se aplicará a esse arquivo de recurso.