Поделиться через


Тестирование по умолчанию

Экземпляр AssemblyLoadContext.Default отвечает за поиск зависимостей сборки. В этой статье описывается логика исследования экземпляра AssemblyLoadContext.Default.

Свойства зондирования, настроенные хостом

При запуске среды выполнения хост среды выполнения предоставляет набор именованных свойств поиска, которые настраивают AssemblyLoadContext.Default пути поиска.

Каждое свойство проверки является необязательным. При наличии каждое свойство представляет собой строковое значение, содержащее список абсолютных путей с разделителями. Разделитель имеет значение ";" в Windows и ":" на всех других платформах.

Название свойства Описание
TRUSTED_PLATFORM_ASSEMBLIES Список путей к файлам платформы и сборки приложения.
PLATFORM_RESOURCE_ROOTS Список путей к каталогам для поиска вспомогательных сборок ресурсов-сателлитов.
NATIVE_DLL_SEARCH_DIRECTORIES Список путей к каталогу для поиска неуправляемых (собственных) библиотек.
APP_PATHS Список путей к каталогам для поиска управляемых сборок.

Как заполняются свойства?

Существует два основных сценария заполнения свойств в зависимости от того, существует ли <файл myapp>.deps.json .

  • Если файл *.deps.json присутствует, он анализируется для заполнения свойств проверки.
  • Если файл *.deps.json отсутствует, предполагается, что каталог приложения содержит все зависимости. Содержимое каталога используется для заполнения свойств проверки.

Кроме того, файлы *.deps.json для любых ссылочных платформ также анализируются.

Переменная DOTNET_ADDITIONAL_DEPS среды может использоваться для добавления дополнительных зависимостей. dotnet.exe также содержит необязательный --additional-deps параметр, чтобы задать это значение при запуске приложения.

Свойство APP_PATHS не заполняется по умолчанию и опущено для большинства приложений.

Список всех файлов *.deps.json , используемых приложением, можно получить через System.AppContext.GetData("APP_CONTEXT_DEPS_FILES").

Как просмотреть свойства проверки из управляемого кода?

Каждое свойство доступно путем вызова AppContext.GetData(String) функции с именем свойства из приведенной выше таблицы.

Как выполнить отладку построения свойств зондирования?

Хост среды выполнения .NET Core выводит полезные сообщения трасси́рования при включении определенных переменных среды.

переменная окружения Описание
COREHOST_TRACE=1 Включает трассировку.
COREHOST_TRACEFILE=<path> Выполняет трассировку по пути к файлу вместо значения по умолчанию stderr.
COREHOST_TRACE_VERBOSITY Устанавливает уровень детализации от 1 (самый низкий) до 4 (самый высокий).

Проверка по умолчанию управляемой сборки

При поиске управляемой сборки порядок AssemblyLoadContext.Default выглядит следующим образом:

  • Файлы, соответствующие шаблону AssemblyName.Name в TRUSTED_PLATFORM_ASSEMBLIES (после удаления расширений).
  • Файлы сборок в APP_PATHS с общими расширениями файлов.

Проверка сборки ресурсов для спутников

Чтобы найти спутниковую сборку для конкретной культуры, создайте набор путей к файлам.

Для каждого пути в PLATFORM_RESOURCE_ROOTS и затем APP_PATHSдобавьте CultureInfo.Name строку, разделитель каталогов, AssemblyName.Name строку и расширение ".dll".

Если какой-либо соответствующий файл существует, попытайтесь загрузить и вернуть его.

Неуправляемый (нативный) поиск библиотеки

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

  1. Проверьте, представляет ли указанное имя библиотеки абсолютный или относительный путь.

  2. Если имя представляет абсолютный путь, используйте имя непосредственно для всех последующих операций. В противном случае используйте названия и создавайте комбинации, определяемые платформой. Сочетания состоят из определенных префиксов платформы (например, lib) и /или суффиксов (например, .dll, .dylibи .so). Это не исчерпывающий список, и он не представляет точные усилия, сделанные на каждой платформе. Это просто пример того, что учитывается. Дополнительные сведения см. в разделе загрузки собственной библиотеки.

  3. Имя и, если путь является относительным, каждую комбинацию используют в следующих шагах. Первая успешная попытка загрузки немедленно возвращает дескриптор загруженной библиотеки.

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

    • Если DefaultDllImportSearchPathsAttribute либо не определён в вызываемой сборке или p/invoke, либо определён и включает DllImportSearchPath.AssemblyDirectory, добавьте имя или комбинацию в каталог вызывающей сборки и попытайтесь загрузить.

    • Используйте его непосредственно для загрузки библиотеки.

  4. Укажите, что не удалось загрузить библиотеку.