Cómo se asigna un nombre a los archivos de manifiesto del recurso
Cuando MSBuild compila un proyecto de .NET Core, los archivos de recursos XML, que tienen la extensión de archivo .resx, se convierten en archivos .resources binarios. Los archivos binarios se insertan en la salida del compilador y los puede leer el ResourceManager. En este artículo se describe cómo MSBuild elige un nombre para cada archivo .resources.
Sugerencia
Si agrega explícitamente un elemento de recurso al archivo de proyecto y también se incluye con los patrones globales de inclusión predeterminados para .NET Core, obtendrá un error de compilación. Para incluir manualmente los archivos de recursos como elementos EmbeddedResource
, establezca la propiedad EnableDefaultEmbeddedResourceItems
en false.
Nombre predeterminado
En .NET Core 3.0 y versiones posteriores, se usa el nombre predeterminado de un manifiesto del recurso cuando se cumplen las dos condiciones siguientes:
- El archivo de recursos no se incluye de forma explícita en el archivo de proyecto como un elemento
EmbeddedResource
con metadatosLogicalName
,ManifestResourceName
oDependentUpon
. - La propiedad
EmbeddedResourceUseDependentUponConvention
no se ha establecido enfalse
en el archivo del proyecto. De manera predeterminada, esta propiedad está establecida entrue
. Para obtener más información, vea EmbeddedResourceUseDependentUponConvention.
Si el archivo de recursos está ubicado con un archivo de origen ( .cs o .vb) del mismo nombre de archivo raíz, se usa el nombre completo del primer tipo que se define en el archivo de origen para el nombre de archivo de manifiesto. Por ejemplo, si MyNamespace.Form1
es el primer tipo definido en Form1.cs, y Form1.cs se ubica conjuntamente con Form1.resx, el nombre de manifiesto generado para ese archivo de recursos es MyNameSpace.Form1.resources.
Metadatos LogicalName
Si un archivo de recursos se incluye explícitamente en el archivo de proyecto como un elemento EmbeddedResource
con metadatos LogicalName
, se usa el valor LogicalName
como nombre de manifiesto. LogicalName
tiene prioridad sobre cualquier otro metadato o configuración.
Por ejemplo, el nombre de manifiesto del archivo de recursos que se define en el siguiente fragmento de archivo de proyecto es SomeName.resources.
<EmbeddedResource Include="X.resx" LogicalName="SomeName.resources" />
O bien
<EmbeddedResource Include="X.fr-FR.resx" LogicalName="SomeName.resources" />
Nota
Si no se especifica
LogicalName
, un objetoEmbeddedResource
con dos puntos (.
) en el nombre de archivo no funciona, lo que significa queGetManifestResourceNames
no devuelve ese archivo.El ejemplo siguiente funciona correctamente:
<EmbeddedResource Include="X.resx" />
El ejemplo siguiente no funciona:
<EmbeddedResource Include="X.fr-FR.resx" />
Metadatos ManifestResourceName
Si un archivo de recursos se incluye explícitamente en el archivo de proyecto como un elemento EmbeddedResource
con metadatos ManifestResourceName
(y LogicalName
no está presente), se usa el valor ManifestResourceName
combinado con la extensión de archivo .resources como nombre de archivo de manifiesto.
Por ejemplo, el nombre de manifiesto del archivo de recursos que se define en el siguiente fragmento de archivo de proyecto es SomeName.resources.
<EmbeddedResource Include="X.resx" ManifestResourceName="SomeName" />
El nombre de manifiesto del archivo de recursos que se define en el siguiente fragmento de archivo de proyecto es SomeName.fr-FR.resources.
<EmbeddedResource Include="X.fr-FR.resx" ManifestResourceName="SomeName.fr-FR" />
Metadatos DependentUpon
Si un archivo de recursos se incluye explícitamente en el archivo de proyecto como un elemento EmbeddedResource
con metadatos DependentUpon
(y LogicalName
y ManifestResourceName
no están presentes), se usa la información del archivo de origen definido por DependentUpon
para el nombre de archivo de manifiesto del recurso. Específicamente, el nombre del primer tipo que se define en el archivo de código fuente se usa en el nombre del manifiesto como se indica a continuación: Namespace.Classname[.Culture].resources.
Por ejemplo, el nombre de manifiesto del archivo de recursos que se define en el siguiente fragmento de archivo de proyecto es Namespace.Classname.resources (donde Namespace.Classname
es la primera clase que se define en MyTypes.cs).
<EmbeddedResource Include="X.resx" DependentUpon="MyTypes.cs">
El nombre de manifiesto del archivo de recursos que se define en el siguiente fragmento de archivo de proyecto es Namespace.Classname.fr-FR.resources (donde Namespace.Classname
es la primera clase que se define en MyTypes.cs).
<EmbeddedResource Include="X.fr-FR.resx" DependentUpon="MyTypes.cs">
EmbeddedResourceUseDependentUponConvention property
Si EmbeddedResourceUseDependentUponConvention
se establece enfalse
en el archivo de proyecto, cada nombre del archivo de manifiesto del recurso se basa en el espacio de nombres raíz del proyecto y en la ruta de acceso relativa desde la raíz del proyecto al archivo .resx. Más específicamente, el nombre de archivo de manifiesto del recurso generado es RootNamespace.RelativePathWithDotsForSlashes.[Culture.]resources. Esta es también la lógica que se usa para generar nombres de manifiesto en versiones de .NET Core anteriores a la 3.0.
Nota
- Si
RootNamespace
no está definido, se toma como valor predeterminado el nombre del proyecto. - Si se especifican metadatos
LogicalName
,ManifestResourceName
oDependentUpon
para un elementoEmbeddedResource
del archivo de proyecto, esta regla de nomenclatura no se aplica a ese archivo de recursos.