Jak mają być nazwane pliki manifestu zasobu

Gdy program MSBuild kompiluje projekt .NET Core, pliki zasobów XML, które mają rozszerzenie pliku resx , są konwertowane na pliki binarne .resources . Pliki binarne są osadzone w danych wyjściowych kompilatora i mogą być odczytywane przez element ResourceManager. W tym artykule opisano, jak program MSBuild wybiera nazwę dla każdego pliku resources .

Napiwek

Jeśli jawnie dodasz element zasobu do pliku projektu i jest on również dołączony do domyślnych elementów globs include dla platformy .NET Core, zostanie wyświetlony błąd kompilacji. Aby ręcznie dołączyć pliki zasobów jako EmbeddedResource elementy, ustaw EnableDefaultEmbeddedResourceItems właściwość na false.

Nazwa domyślna

W programie .NET Core 3.0 lub nowszym jest używana domyślna nazwa manifestu zasobu, gdy zostaną spełnione oba następujące warunki:

  • Plik zasobu nie jest jawnie dołączany do pliku projektu jako EmbeddedResource element z elementem LogicalName, ManifestResourceNamelub DependentUpon metadanymi.
  • Właściwość nie jest ustawiona EmbeddedResourceUseDependentUponConvention na false wartość w pliku projektu. Domyślnie wartość tej właściwości to true. Aby uzyskać więcej informacji, zobacz EmbeddedResourceUseDependentUponConvention.

Jeśli plik zasobu jest kolokowany z plikiem źródłowym (.cs lub .vb) o tej samej nazwie pliku głównego, pełna nazwa pierwszego typu zdefiniowanego w pliku źródłowym jest używana dla nazwy pliku manifestu. Jeśli na przykład MyNamespace.Form1 jest pierwszym typem zdefiniowanym w Form1.cs, a Form1.cs jest colocated z form1.resx, wygenerowana nazwa manifestu dla tego pliku zasobu to MyNamespace.Form1.resources.

Metadane nazwy logicznej

Jeśli plik zasobu jest jawnie uwzględniony w pliku projektu jako EmbeddedResource element z metadanymi LogicalName , LogicalName wartość jest używana jako nazwa manifestu. LogicalName ma pierwszeństwo przed innymi metadanymi lub ustawieniem.

Na przykład nazwa manifestu pliku zasobu zdefiniowanego w poniższym fragmencie pliku projektu to SomeName.resources.

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

— lub —

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

Uwaga

  • Jeśli LogicalName nie zostanie określony, nie będzie działać kropka EmbeddedResource z dwiema kropkami (.) w nazwie pliku, co oznacza, że GetManifestResourceNames nie zwraca tego pliku.

    Poniższy przykład działa poprawnie:

    <EmbeddedResource Include="X.resx" />
    

    Poniższy przykład nie działa:

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

Metadane ManifestResourceName

Jeśli plik zasobu jest jawnie dołączany do pliku projektu jako EmbeddedResource element z ManifestResourceName metadanymi (i LogicalName jest nieobecny), ManifestResourceName wartość w połączeniu z rozszerzeniem pliku resources jest używana jako nazwa pliku manifestu.

Na przykład nazwa manifestu pliku zasobu zdefiniowanego w poniższym fragmencie pliku projektu to SomeName.resources.

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

Nazwa manifestu pliku zasobu zdefiniowanego w poniższym fragmencie pliku projektu to SomeName.fr-FR.resources.

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

Metadane zależneOpon

Jeśli plik zasobu jest jawnie dołączany do pliku projektu jako EmbeddedResource element z DependentUpon metadanymi (i LogicalNameManifestResourceName są nieobecne), informacje z pliku źródłowego zdefiniowanego przez DependentUpon jest używane dla nazwy pliku manifestu zasobu. W szczególności nazwa pierwszego typu zdefiniowanego w pliku źródłowym jest używana w nazwie manifestu w następujący sposób: Namespace.Classname[. Culture].resources.

Na przykład nazwa manifestu pliku zasobu zdefiniowanego w poniższym fragmencie pliku projektu to Namespace.Classname.resources (gdzie Namespace.Classname jest pierwszą klasą zdefiniowaną w MyTypes.cs).

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

Nazwa manifestu pliku zasobu zdefiniowanego w poniższym fragmencie pliku projektu to Namespace.Classname.fr-FR.resources (gdzie Namespace.Classname jest pierwszą klasą zdefiniowaną w MyTypes.cs).

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

Właściwość EmbeddedResourceUseDependentUponConvention

Jeśli EmbeddedResourceUseDependentUponConvention jest ustawiona false na wartość w pliku projektu, każda nazwa pliku manifestu zasobu jest oparta na głównej przestrzeni nazw projektu i ścieżce względnej z katalogu głównego projektu do pliku resx . Dokładniej mówiąc, wygenerowany plik manifestu zasobu to RootNamespace.RelativePathWithDotsForSlashes.[ Kultura.] zasoby. Jest to również logika używana do generowania nazw manifestów w wersjach platformy .NET Core wcześniejszych niż 3.0.

Uwaga

  • Jeśli RootNamespace nie jest zdefiniowana, wartość domyślna to nazwa projektu.
  • Jeśli LogicalNameparametr , ManifestResourceNamelub DependentUpon metadane są określone dla EmbeddedResource elementu w pliku projektu, ta reguła nazewnictwa nie ma zastosowania do tego pliku zasobów.

Zobacz też