通过


卫星程序集加载算法

可以使用卫星程序集来存储为语言和文化自定义的本地化资源。

附属程序集使用的加载算法与常规托管程序集不同。

卫星程序集何时加载?

加载本地化资源时加载附属程序集。

加载本地化资源的基本 API 是 System.Resources.ResourceManager 类。 最后,ResourceManager 类将为每个 GetSatelliteAssembly 调用 CultureInfo.Name 方法。

较高级别的 API 可能会抽象低级别 API。

算法

.NET Core 资源回退进程包含以下步骤:

  1. 确定 activeAssemblyLoadContext 实例。 在所有情况下,active 实例都是执行程序集的 AssemblyLoadContext

  2. active 实例按以下优先级顺序加载已请求文化的附属程序集:

  3. 如果加载附属程序集:

    • 引发 AppDomain.AssemblyLoad 事件。
    • 将搜索程序集以查找请求的资源。 如果运行时在程序集中找到该资源,则使用它。 如果找不到该资源,将继续搜索。

    注意

    要在附属程序集中找到资源,运行时会搜索 ResourceManager 请求的当前 CultureInfo.Name 的资源文件。 在资源文件中,它搜索请求的资源名称。 如果找不到上述任何一个,则资源将被视为未找到。

  4. ResourceManager 接下来通过多个可能的级别搜索父级文化程序集,每次均重复步骤 2 和 3。

    每种文化只有一个父级,由 CultureInfo.Parent 属性定义。

    当区域性的 Parent 属性为 CultureInfo.InvariantCulture 时,父区域性搜索将停止。

    对于 InvariantCulture,我们不会返回到步骤 2 和 3,而是继续执行步骤 5。

  5. 如果仍未找到资源,则 ResourceManager 将使用默认(回退)区域性的资源。

    通常,默认文化的资源包含在主应用程序集。 不过,可以为 UltimateResourceFallbackLocation.Satellite 属性指定 NeutralResourcesLanguageAttribute.Location。 此值指示资源的最终回退位置是附属程序集,而不是主程序集。

    注意

    默认文化是最后备援。 因此,建议在默认资源文件中始终包含一组详尽的资源。 这有助于防止引发异常。 通过拥有详尽的资源集,可为所有资源提供备选方案,并确保始终向用户呈现至少一种资源,即使该资源不是特定于文化的。

  6. 最后,