如何命名資源資訊清單檔
當 MSBuild 編譯 .NET Core 專案時,具有 .resx 副檔名的 XML 資源檔會轉換成二進位 .resources 檔案。 二進位檔案會內嵌到編譯器的輸出中,而且可由 ResourceManager 讀取。 本文說明 MSBuild 如何為每個 .resources 檔案選擇名稱。
提示
如果您明確地將資源項目新增至專案檔,而且也會隨附於 .NET Core 的預設隨附 Globs 中,您會收到建置錯誤。 若要手動包含資源檔做為 EmbeddedResource
項目,請將 EnableDefaultEmbeddedResourceItems
屬性設定為 false。
預設名稱
在 .NET Core 3.0 和更新版本中,符合下列兩個條件時會使用資源資訊清單的預設名稱:
- 資源檔未明確包含在專案檔中,做為具有
LogicalName
、ManifestResourceName
或DependentUpon
中繼資料的EmbeddedResource
項目。 EmbeddedResourceUseDependentUponConvention
屬性不會在專案檔中設定為false
。 根據預設,這個屬性設定為true
。 如需詳細資訊,請參閱 EmbeddedResourceUseDependentUponConvention。
如果資源檔與來源檔案共置 (.cs 或 .vb) 相同的根檔案名,則會使用原始程式檔中定義之第一個類型的完整名稱作為資訊清單檔名稱。 例如,如果 MyNamespace.Form1
是 Form1.cs 中定義的第一個類型,而 Form1.cs 與 Form1.resx 共置,則該資源檔的產生資訊清單名稱為 MyNamespace.Form1.resources。
LogicalName 中繼資料
如果專案檔中明確包含資源檔做為 LogicalName
中繼資料的 EmbeddedResource
項目,則會使用 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
項目搭配 ManifestResourceName
中繼資料 (且 LogicalName
不存在),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
項目搭配 DependentUpon
中繼資料 (且 LogicalName
和 ManifestResourceName
不存在),則所 DependentUpon
定義來源檔案的資訊會用於資源資訊清單檔案名稱。 具體來說,原始程式檔中定義的第一個類型名稱會用在資訊清單名稱中,如下所示:Namespace.Classname[.Culture].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.[Culture.]resources。 這也是在 .NET Core 3.0 之前的版本中用來產生資訊清單名稱的邏輯。
注意
- 如果未定義
RootNamespace
,則會預設為專案名稱。 - 如果為專案檔中的
EmbeddedResource
項目指定了LogicalName
、ManifestResourceName
或DependentUpon
中繼資料,則此命名規則不適用於該資源檔。