當 MSBuild 編譯 .NET Core 專案時,擴展名為 .resx 的 XML 資源文件會轉換成二進位 .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元數據(並且ManifestResourceName不存在),則LogicalName與檔案擴展名 ManifestResourceName 結合後的值將用作指令清單檔名。
例如,下列項目檔代碼段中所定義之資源檔的指令清單名稱是 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。 這也是在 3.0 之前的 .NET Core 版本中產生指令清單名稱的邏輯。
備註
- 如果未
RootNamespace定義,則會預設為項目名稱。 - 如果在項目檔中的
LogicalName項目指定了ManifestResourceName、DependentUpon或EmbeddedResource元數據,則此命名規則不會套用至該資源檔。