Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
При запуске приложения с определенными ресурсами идентификатора среды выполнения (RID) хост определяет, какие ресурсы соответствуют платформе, на которой он выполняется. Это относится как к самому приложению, так и к логике разрешения, используемой AssemblyDependencyResolver.
Ранее хост пытался вычислить RID во время выполнения, а затем считать граф RID, чтобы определить, какие ресурсы, специфичные для RID, совпадают или совместимы с вычисленным RID. Теперь поведение по умолчанию не вычисляет RID или использует граф RID. Вместо этого хост использует известный список идентификаторов RIDs, основываясь на том, как была создана сама среда выполнения.
Предыдущее поведение
Ранее процесс выбора ресурсов, относящихся к RID, был следующим:
- Считывает граф RID из файла.deps.json корневой платформы (Microsoft.NetCore.App).
- Вычислить текущий RID во время выполнения и попытаться найти запись для него в графе RID. Если он не существует, проверьте альтернативный RID (встроенный в хост во время компиляции).
- Начиная с записи в графе RID, найдите ресурсы, соответствующие этому идентификатору RID.
- Продолжайте просматривать список идентификаторов в записи графа RID до тех пор, пока не будет найдено совпадение актива либо список не закончится.
Если у графика RID отсутствует вычисляемый RID или резервный RID, ресурсы RID не были разрешены должным образом.
Новое поведение
По умолчанию процесс больше не зависит от графа RID. Вместо этого он проверяет известный набор переносимых идентификаторов (RIDs), исходя из того, как была создана машина. Рассмотрим пример.
Линукс
- Linux-x64
- Линукс
- unix-x64
- Юникс
- любой
Виндоус
- win-x64
- победа
- любой
macOS
- osx-x64
- OS X
- unix-x64
- Юникс
Для непереносимых сборок узла или среды выполнения сборка может также задать непереносимый RID, который проверяется первым.
Представленная версия
.NET 8( предварительная версия 5)
Тип разрушающего изменения
Это изменение может повлиять на совместимость двоичных файлов и также является изменением поведения.
Причина изменения
Граф RID был дорогостоящим в обслуживании и понимании, требуя от самой платформы .NET быть адаптированной к различным дистрибутивам в чувствительной манере. Команда .NET и сообщество тратят значительное количество времени на обновление графа и перенос таких обновлений на предыдущие выпуски. Долгосрочная цель заключается в том, чтобы прекратить обновление графа RID, прекратить чтение и в конечном итоге удалить его. Это критическое изменение является шагом к этой цели.
Рекомендуемое действие
Используйте переносимые идентификаторы, например, linux, linux-musl, osx, и win. Для специализированных вариантов использования можно использовать ТАКИЕ API, как NativeLibrary.SetDllImportResolver(Assembly, DllImportResolver) или AssemblyLoadContext.ResolvingUnmanagedDll для пользовательской логики загрузки.
Если необходимо вернуться к предыдущему поведению, установите переключатель обратной совместимости System.Runtime.Loader.UseRidGraph на true в файлеruntimeconfig.json. Установка переключателя в положение true направляет хост использовать прежнее поведение для чтения графа RID. Кроме того, в файле проекта можно задать значение свойства MSBuild UseRidGraph для true. Например.
<PropertyGroup>
<UseRidGraph>true</UseRidGraph>
</PropertyGroup>