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


Узел определяет ресурсы, относящиеся к RID

При запуске приложения с определенными ресурсами идентификатора среды выполнения (RID) узел определяет, какие ресурсы относятся к платформе, на которой она работает. Это относится как к самому приложению, так и к логике разрешения, используемой AssemblyDependencyResolver.

Ранее узел пытался вычислить RID во время выполнения, а затем считывать граф RID, чтобы определить, какие ресурсы, связанные с RID, совпадают или совместимы с вычисляемым RID. Теперь поведение по умолчанию не вычисляет RID или использует граф RID. Вместо этого узел использует известный список идентификаторов riD в зависимости от того, как была создана сама среда выполнения.

Прежнее поведение

Ранее процесс выбора ресурсов, относящихся к RID, был следующим:

  1. Считывает граф RID из файла .deps.json корневой платформы (Microsoft.NetCore.App).
  2. Вычислить текущий RID во время выполнения и попытаться найти запись для нее в графе RID. Если он не существует, проверка для резервного rid (встроенного в узел во время компиляции).
  3. Начиная с записи, найденной на графе RID, найдите ресурсы, соответствующие этой инструкции RID.
  4. Перейдите вниз по списку идентификаторов в записи графа RID до тех пор, пока не будет найдено соответствие актива или список заканчивается.

Если граф RID не имеет вычисляемого RID или резервного RID, ресурсы RID не были правильно разрешены.

Новое поведение

По умолчанию процесс больше не зависит от графа RID. Вместо этого он проверка для известного набора переносимых идентификаторов RID в зависимости от того, как был создан узел. Например:

Linux

  • Linux-x64
  • linux
  • unix-x64
  • Unix
  • любое

Windows

  • win-x64
  • победа
  • любое

macOS

  • osx-x64
  • Osx
  • unix-x64
  • Unix

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

Представленные версии

.NET 8( предварительная версия 5)

Тип критического изменения

Это изменение может повлиять на совместимость двоичных файлов и также является изменением поведения.

Причина изменения

Граф RID был дорогостоящим для поддержания и понимания, требуя от себя .NET быть дистрибутивом в хрупкой манере. Команда .NET и сообщество тратят нетривиальное время обновления графа и резервного копирования таких обновлений до предыдущих выпусков. Долгосрочная цель заключается в том, чтобы прекратить обновление графа RID, прекратить чтение и в конечном итоге удалить его. Это критическое изменение является шагом к этой цели.

Используйте переносимые идентификаторы, например , linux, linux-muslosxи win. Для специализированных вариантов использования можно использовать ТАКИЕ API, как NativeLibrary.SetDllImportResolver(Assembly, DllImportResolver) или AssemblyLoadContext.ResolvingUnmanagedDll для пользовательской логики загрузки.

Если необходимо отменить изменения к предыдущему поведению, установите переключатель System.Runtime.Loader.UseRidGraphtrue обратной совместимости в файле runtimeconfig.json. Задание переключателя true для указания узлу использовать предыдущее поведение чтения графа RID. Кроме того, можно задать UseRidGraph для свойства true MSBuild значение в файле проекта. Например.

<PropertyGroup>
  <UseRidGraph>true</UseRidGraph>
</PropertyGroup>

Затронутые API

См. также