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


Стандартное зондирование

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

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

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

Все свойства зондирования являются необязательными. Если свойство есть, оно представляет собой строковое значение со списком абсолютных путей с разделителями. В качестве разделителя используется символ ";" в ОС Windows или ":" на всех других платформах.

Имя свойства Description
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 будет выводить полезные сообщения трассировки, если настроены определенные переменные среды:

Переменная среды Description
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 в вызываемой сборке или вызове не определена или включена DllImportSearchPath.AssemblyDirectory, добавьте имя или сочетание в каталог вызываемой сборки и попытайтесь загрузить.

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

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