分享方式:


附屬組件載入演算法

附屬組件可用來儲存針對語言和文化特性自訂的當地語系化資源。

附屬組件使用的載入演算法不同於一般的受控組件。

何時載入附屬組件?

載入當地語系化資源時載入附屬組件。

載入當地語系化資源的基本 API 是 System.Resources.ResourceManager 類別。 最後,ResourceManager 類別會針對每一個 CultureInfo.Name 呼叫 GetSatelliteAssembly 方法。

較高層級的 API 可以擷取低層級的 API。

演算法

.NET Core 資源後援處理序包含下列步驟:

  1. 決定 activeAssemblyLoadContext 執行個體。 在所有情況下,active 執行個體均執行組件的 AssemblyLoadContext

  2. active 執行個體會嘗試以下列優先順序載入所要求之文化特性的附屬組件:

  3. 如果載入附屬組件:

    • 便會引發 AppDomain.AssemblyLoad 事件。
    • 系統會搜尋組件,尋找所要求的資源。 如果執行階段愛組件中找到資源,則會使用它。 如果找不到資源,會繼續搜尋。

    注意

    為了在附屬組件內尋找資源,執行階段會搜尋目前 CultureInfo.NameResourceManager 所要求的資源檔。 在資源檔案內,搜尋所要求的資源名稱。 如果找不到任一個,就會將資源視為找不到。

  4. ResourceManager 接下來會在許多可能的層級中搜尋父文化特性組件,每次均會重複執行步驟 2 和 3。

    每一種文化特性都只有一個父代,由 CultureInfo.Parent 屬性所定義。

    當文化特性的 Parent 屬性是 CultureInfo.InvariantCulture 時,即會停止搜尋父文化特性。

    針對 InvariantCulture,我們不會回到步驟 2 和 3,而是繼續執行步驟 5。

  5. 如果仍然找不到資源,則 ResourceManager 會使用預設 (後援) 文化特性的資源。

    通常,主要應用程式組件中會包含預設文化特性的資源。 不過,您可以為 NeutralResourcesLanguageAttribute.Location 屬性指定 UltimateResourceFallbackLocation.Satellite 。 此值指出資源的最終後援位置是附屬組件,而不是主要組件。

    注意

    預設文化特性是最終後援。 因此,建議您一律在預設資源檔中包含一組完整資源。 這樣有助於防止擲回例外狀況。 有了一整組的資源後,您就能為所有資源提供後援,並確保使用者至少一定會有一個資源,即使該資源不是文化特有資源也一樣。

  6. 最後