如何命名資源資訊清單檔

當 MSBuild 編譯 .NET Core 專案時,具有 .resx 副檔名的 XML 資源檔會轉換成二進位 .resources 檔案。 二進位檔案會內嵌到編譯器的輸出中,而且可由 ResourceManager 讀取。 本文說明 MSBuild 如何為每個 .resources 檔案選擇名稱。

提示

如果您明確地將資源項目新增至專案檔,而且也會隨附於 .NET Core 的預設隨附 Globs 中,您會收到建置錯誤。 若要手動包含資源檔做為 EmbeddedResource 項目,請將 EnableDefaultEmbeddedResourceItems 屬性設定為 false。

預設名稱

在 .NET Core 3.0 和更新版本中,符合下列兩個條件時會使用資源資訊清單的預設名稱:

  • 資源檔未明確包含在專案檔中,做為具有 LogicalNameManifestResourceNameDependentUpon 中繼資料的 EmbeddedResource 項目。
  • EmbeddedResourceUseDependentUponConvention 屬性不會在專案檔中設定為 false。 根據預設,這個屬性設定為 true。 如需詳細資訊,請參閱 EmbeddedResourceUseDependentUponConvention

如果資源檔與來源檔案共置 (.cs.vb) 相同的根檔案名,則會使用原始程式檔中定義之第一個類型的完整名稱作為資訊清單檔名稱。 例如,如果 MyNamespace.Form1Form1.cs 中定義的第一個類型,而 Form1.csForm1.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 中繼資料 (且 LogicalNameManifestResourceName 不存在),則所 DependentUpon 定義來源檔案的資訊會用於資源資訊清單檔案名稱。 具體來說,原始程式檔中定義的第一個類型名稱會用在資訊清單名稱中,如下所示:Namespace.Classname[.Culture].resources

例如,下列專案檔程式碼片段中所定義之資源檔的資訊清單名稱是 Namespace.Classname.resources (其中 Namespace.ClassnameMyTypes.cs 中定義的第一個類別)。

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

下列專案檔程式碼片段中所定義之資源檔的資訊清單名稱是 Namespace.Classname.fr-FR.resources (其中 Namespace.ClassnameMyTypes.cs 中定義的第一個類別)。

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

EmbeddedResourceUseDependentUponConvention 屬性

如果 EmbeddedResourceUseDependentUponConvention 在專案檔中設定為 false,則每個資源資訊清單檔案名稱都是以專案的根命名空間為基礎,以及從專案根目錄到 .resx 檔案的相對路徑。 更具體來說,產生的資源資訊清單檔案名稱是 RootNamespace.RelativePathWithDotsForSlashes.[Culture.]resources。 這也是在 .NET Core 3.0 之前的版本中用來產生資訊清單名稱的邏輯。

注意

  • 如果未定義 RootNamespace,則會預設為專案名稱。
  • 如果為專案檔中的 EmbeddedResource 項目指定了 LogicalNameManifestResourceNameDependentUpon 中繼資料,則此命名規則不適用於該資源檔。

另請參閱