Алгоритм загрузки вспомогательных сборок

Вспомогательные сборки используются для хранения локализованных ресурсов, то есть настроенных для конкретного языка и региональных параметров.

Для вспомогательных сборок используется другой алгоритм загрузки, отличный от алгоритма для обычных управляемых сборок.

Когда загружаются вспомогательные сборки?

Вспомогательные сборки загружаются вместе с локализованным ресурсом.

Базовый API для загрузки локализованных ресурсов — класс System.Resources.ResourceManager. В конечном итоге именно класс ResourceManager будет вызывать метод GetSatelliteAssembly для каждого свойства CultureInfo.Name.

Интерфейсы API более высокого уровня могут быть абстракцией API нижнего уровня.

Алгоритм

Процесс использования резервных ресурсов .NET Core включает следующие шаги.

  1. Определение экземпляра activeAssemblyLoadContext. Во всех случаях экземпляром active считается AssemblyLoadContext исполняемой сборки.

  2. Экземпляр active загружает вспомогательную сборку для запрошенного языка и региональных параметров в следующем порядке приоритета:

    • Проверьте его кэш.

    • Если active экземпляр является экземпляром AssemblyLoadContext.Default , запустите логику проверки сборки по умолчанию (ресурс).

    • Вызовите функцию AssemblyLoadContext.Load.

    • Если управляемая сборка, соответствующая вспомогательной сборке, была загружена из файла, проверка каталог управляемой сборки для подкаталога, соответствующего запрошенной CultureInfo.Name (например, es-MX).

      Примечание.

      В ОС Linux и macOS в именах подкаталогов учитывается регистр. Они должны:

      • либо точно совпадать с учетом регистра;
      • либо содержать только строчные буквы.
    • AssemblyLoadContext.Resolving Вызов события.

    • AppDomain.AssemblyResolve Вызов события.

  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. Итак:

    • если среда выполнения не находит файл ресурсов для стандартного (резервного) языка и региональных параметров, возникает исключение MissingManifestResourceException или MissingSatelliteAssemblyException;
    • если файл ресурсов найден, но запрошенного ресурса в нем нет, то запрос возвращает null.