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 elementemLogicalName
,ManifestResourceName
lubDependentUpon
metadanymi. - Właściwość nie jest ustawiona
EmbeddedResourceUseDependentUponConvention
nafalse
wartość w pliku projektu. Domyślnie wartość tej właściwości totrue
. 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ć kropkaEmbeddedResource
z dwiema kropkami (.
) w nazwie pliku, co oznacza, żeGetManifestResourceNames
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 LogicalName
ManifestResourceName
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
LogicalName
parametr ,ManifestResourceName
lubDependentUpon
metadane są określone dlaEmbeddedResource
elementu w pliku projektu, ta reguła nazewnictwa nie ma zastosowania do tego pliku zasobów.