衛星組件可用來儲存為文化語言自訂的區域資源。
衛星組件使用的載入演算法不同於一般的受控組件。
衛星組件何時載入?
當載入在地化資源時,會載入衛星組件。
載入當地語系化資源的基本 API 是 System.Resources.ResourceManager 類別。 最後,ResourceManager 類別會針對每一個 GetSatelliteAssembly 呼叫 CultureInfo.Name 方法。
較高層級的 API 可以擷取低層級的 API。
演算法
.NET Core 資源後援處理序包含下列步驟:
確定
activeAssemblyLoadContext 執行個體。 在所有情況下,active執行個體均為執行組件的 AssemblyLoadContext。active執行個體會依照以下優先順序載入所要求文化的衛星組件:檢查其快取。
如果
active是 AssemblyLoadContext.Default 執行個體,則執行預設附屬 (資源) 組件探查邏輯。呼叫 AssemblyLoadContext.Load 函式。
如果受控組件是從檔案載入與附屬組件對應的話,請檢查受控組件的目錄中是否有與所要求的 CultureInfo.Name 相符合的子目錄(例如
es-MX)。注意
在 Linux 和 macOS 上,子目錄會區分大小寫,而且必須符合下列一項條件:
- 大小寫完全相符。
- 請採用小寫字母。
引發 AppDomain.AssemblyResolve 事件。
當載入附屬組件時:
- 便會引發 AppDomain.AssemblyLoad 事件。
- 系統會搜尋組件,尋找所要求的資源。 如果執行階段在組件中找到資源,則會使用它。 如果找不到資源,會繼續搜尋。
注意
為了在附屬組件內尋找資源,執行階段會搜尋當前 CultureInfo.Name 中 ResourceManager 所請求的資源檔案。 在資源檔案內,搜尋所要求的資源名稱。 如果找不到任一個,就會將資源視為找不到。
ResourceManager 接下來會透過多個可能的層級搜尋父文化組件,每次均會重複執行步驟 2 和 3。
每一種文化只有一個父代,由CultureInfo.Parent屬性所定義。
當文化特性的 Parent 屬性是 CultureInfo.InvariantCulture 時,即會停止搜尋父文化特性。
針對 InvariantCulture,我們不會回到步驟 2 和 3,而是繼續執行步驟 5。
如果仍然找不到資源,則 ResourceManager 會使用預設 (後援) 文化特性的資源。
通常,主要應用程式組件中會包含預設文化特性的資源。 不過,您可以為 UltimateResourceFallbackLocation.Satellite 屬性指定 NeutralResourcesLanguageAttribute.Location 。 此值指出資源的最終後援位置是附屬組件,而不是主要組件。
注意
預設語系是最終備援。 因此,建議您一律在預設資源檔中包含一組完整資源。 這樣有助於防止拋出例外狀況。 在擁有一整套資源之後,您可以為所有資源提供備援,並確保使用者至少擁有一個資源,即使該資源不是文化特定的。
最後
- 如果執行階段找不到預設(後援)文化的資源檔案,將會拋出 MissingManifestResourceException 或 MissingSatelliteAssemblyException 例外狀況。
- 如果找到了資源檔,但所要求的資源不存在,則要求會傳回
null。