附屬組件載入演算法
附屬組件可用來儲存針對語言和文化特性自訂的當地語系化資源。
附屬組件使用的載入演算法不同於一般的受控組件。
何時載入附屬組件?
載入當地語系化資源時載入附屬組件。
載入當地語系化資源的基本 API 是 System.Resources.ResourceManager 類別。 最後,ResourceManager 類別會針對每一個 CultureInfo.Name 呼叫 GetSatelliteAssembly 方法。
較高層級的 API 可以擷取低層級的 API。
演算法
.NET Core 資源後援處理序包含下列步驟:
決定
active
AssemblyLoadContext 執行個體。 在所有情況下,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 會使用預設 (後援) 文化特性的資源。
通常,主要應用程式組件中會包含預設文化特性的資源。 不過,您可以為 NeutralResourcesLanguageAttribute.Location 屬性指定 UltimateResourceFallbackLocation.Satellite 。 此值指出資源的最終後援位置是附屬組件,而不是主要組件。
注意
預設文化特性是最終後援。 因此,建議您一律在預設資源檔中包含一組完整資源。 這樣有助於防止擲回例外狀況。 有了一整組的資源後,您就能為所有資源提供後援,並確保使用者至少一定會有一個資源,即使該資源不是文化特有資源也一樣。
最後
- 最後,如果執行階段找不到預設 (後援) 文化特性的資源檔,即會擲回 MissingManifestResourceException 或 MissingSatelliteAssemblyException 例外狀況。
- 如果找到了資源檔,但所要求的資源不存在,則要求會傳回
null
。