Имена файлов манифестов ресурсов

Когда MSBuild компилирует проект .NET Core, файлы ресурсов XML, имеющие расширение файла RESX, преобразуются в двоичные файлы RESOURCES. Двоичные файлы внедряются в выходные данные компилятора и могут быть считаны ResourceManager. В этой статье описывается, как MSBuild выбирает имя для каждого файла RESOURCES.

Совет

Если в файл проекта явно добавлен элемент ресурса, который также включен в глобальные элементы по умолчанию для .NET Core, возникнет ошибка сборки. Чтобы вручную включить файлы ресурсов в качестве элементов EmbeddedResource, установите для свойства EnableDefaultEmbeddedResourceItems значение false.

Имя по умолчанию

В .NET Core 3.0 и более поздних версиях при соблюдении обоих следующих условий манифесту ресурса присваивается имя по умолчанию.

  • Файл ресурсов не включен явным образом в файл проекта как элемент EmbeddedResource с метаданными LogicalName, ManifestResourceName или DependentUpon.
  • В файле проекта для свойства EmbeddedResourceUseDependentUponConvention не задано значение false. По умолчанию для свойства задано значение true. Дополнительные сведения см. в разделе EmbeddedResourceUseDependentUponConvention.

Если файл ресурсов совместно расположен с исходным файлом (CS или VB) с тем же именем корневого файла, то для имени файла манифеста используется полное имя первого типа, определенного в исходном файле. Например, если MyNamespace.Form1 является первым типом, определенным в Form1.cs, а Form1.cs хранится вместе с Form1.resx, то сгенерированным именем манифеста для этого файла ресурсов будет MyNamespace.Form1.resources.

Метаданные LogicalName

Если файл ресурсов явно включен в файл проекта в качестве элемента EmbeddedResource с метаданными LogicalName, в качестве имени манифеста используется значение LogicalName. LogicalName имеет приоритет над любым другим метаданным или параметром.

Например, имя манифеста для файла ресурсов, определенного в следующем фрагменте файла проекта, — SomeName.resources.

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

–или–

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

Примечание.

  • Если параметр LogicalName не указан, то EmbeddedResource с двумя точками (.) в имени файла не работает, а это означает, что GetManifestResourceNames не возвращает этот файл.

    Следующий пример работает правильно:

    <EmbeddedResource Include="X.resx" />
    

    Следующий пример не работает:

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

Метаданные ManifestResourceName

Если файл ресурсов явно включен в файл проекта как элемент EmbeddedResource с метаданными ManifestResourceNameLogicalName отсутствует), в качестве имени файла манифеста используется значение ManifestResourceName в сочетании с расширением файла RESOURCES.

Например, имя манифеста для файла ресурсов, определенного в следующем фрагменте файла проекта, — SomeName.resources.

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

Имя манифеста для файла ресурсов, определенного в следующем фрагменте файла проекта, — SomeName.fr-FR.resources.

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

Метаданные DependentUpon

Если файл ресурсов явно включен в файл проекта как элемент EmbeddedResource с метаданными DependentUponLogicalName и ManifestResourceName отсутствуют), то сведения из исходного файла, определенного DependentUpon, используются для имени файла манифеста ресурса. В частности, имя первого типа, определенного в исходном файле, используется в имени манифеста следующим образом: Namespace.Classname[. Язык и региональные параметры].resources.

Например, имя манифеста для файла ресурсов, определенного в следующем фрагменте файла проекта, — Namespace.Classname.resources (где Namespace.Classname является первым классом, который определен в MyTypes.cs).

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

Имя манифеста для файла ресурсов, определенного в следующем фрагменте файла проекта, — Namespace.Classname.fr-FR.resources (где Namespace.Classname является первым классом, который определен в MyTypes.cs).

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

Свойство EmbeddedResourceUseDependentUponConvention

Если в файле проекта EmbeddedResourceUseDependentUponConvention имеет значение false, каждое имя файла манифеста ресурса будет основано на имени корневого пространства имен проекта и относительном пути к файлу RESX из корневого каталога проекта. В частности, имя файла манифеста созданного ресурса — RootNamespace.RelativePathWithDotsForSlashes.[ Культура.] ресурсы. Такая же логика применяется при генерировании имен манифестов в версиях .NET Core, предшествующих версии 3.0.

Примечание.

  • Если параметр RootNamespace не определен, по умолчанию используется имя проекта.
  • Если для элемента EmbeddedResource в файле проекта заданы метаданные LogicalName, ManifestResourceName или DependentUpon, это правило именования не применяется к этому файлу ресурсов.

См. также