Каталог идентификаторов сред выполнения в .NET

RID является коротким для идентификатора среды выполнения. Идентификаторы RID служат для идентификации целевых платформ, на которых выполняется приложение. Они используются пакетами .NET для представления ресурсов, специфичных для платформы, в пакетах NuGet. Ниже приведены примеры идентификаторов RID: linux-x64, win-x64или osx-x64. Для пакетов с собственными зависимостями они указывают, на каких платформах можно восстановить пакет.

Один идентификатор RID можно задать в элементе <RuntimeIdentifier> вашего файла проекта. Несколько идентификаторов RID можно определить в виде списка, разделенного точкой с запятой, в элементе <RuntimeIdentifiers> файла проекта. Они также используются с помощью параметра --runtime со следующими командами интерфейса командной строки .NET:

Идентификаторы RID, представляющие отдельные операционные системы, обычно имеют следующий формат: [os].[version]-[architecture]-[additional qualifiers], где:

  • [os] — это моникер платформы или операционной системы. Например, ubuntu.

  • [version] — это версия операционной системы в виде номера, разделенного точкой (.). Например, 15.10.

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

  • [architecture] — это архитектура процессора. Например, x86, x64, armили arm64.

  • [additional qualifiers] дополнительно дифференцируют разные платформы. Например: aot.

Схема RID

Схема RID или резервная схема среды выполнения — это список идентификаторов RID, которые совместимы друг с другом.

Эти ИДЕНТИФИКАТОРы определяются в PortableRuntimeIdentifierGraph.json в репозитории dotnet/sdk . В этом файле можно увидеть, что все идентификаторы RID, кроме основного, содержат оператор "#import". Эти операторы указывают совместимые RID.

До версии .NET 8 в пакет Microsoft.NETCore.Platform и граф RID в файле runtime.json, который находится в dotnet/runtimeрепозитории, регулярно добавляются в пакет microsoft.NETCore.Platform. Этот граф больше не обновляется и существует в качестве варианта обратной совместимости. Разработчики должны использовать идентификаторы RID, не относящиеся к версии и не относящиеся к дистрибутивам.

Когда NuGet восстанавливает пакеты, он пытается найти точное совпадение для указанной среды выполнения. Если его не удается найти, NuGet проходит схему до тех пор, пока не найдет ближайшую совместимую систему в соответствии со схемой RID.

Ниже приведена запись для идентификатора RID osx-x64:

"osx-x64": {
    "#import": [ "osx", "unix-x64" ]
}

Приведенный выше идентификатор RID указывает, что osx-x64 импортирует unix-x64. Поэтому при восстановлении пакетов NuGet пытается найти точное совпадение osx-x64 в пакете. Если NuGet не удается найти определенную среду выполнения, он может восстановить пакеты, указывающие unix-x64 среды выполнения, например.

В следующем примере показана немного большая схема RID, которая также указана в файле runtime.json:

    linux-arm64     linux-arm32
         |     \   /     |
         |     linux     |
         |       |       |
    unix-arm64   |    unix-x64
             \   |   /
               unix
                 |
                any

Кроме того, с помощью средства RidGraph можно легко визуализировать граф RID (или любое подмножество графа).

Все идентификаторы RID в конечном итоге сопоставляются с корневым идентификатором RID any.

При работе с идентификаторами RID следует учитывать некоторые моменты:

  • Не пытайтесь анализировать идентификаторы RID для получения частей компонента.

  • Используйте только те идентификаторы RID, которые уже определены для платформы.

  • Идентификаторы RID должны указываться точно. Предположения недопустимы.

  • Не создавайте идентификаторы RID программным способом, если это не обязательно.

    Некоторые приложения должны вычислить идентификаторы RID программным способом. В этом случае вычисляемый идентификатор должен точно соответствовать каталогу, в том числе в регистре. Идентификаторы с разными регистрами могут вызвать проблемы, если операционная система учитывает регистр, например Linux, так как это значение часто используется при создании таких путей вывода. Например, рассмотрим настраиваемый мастер публикации в Visual Studio, который использует сведения из диспетчера конфигурации решения и свойств проекта. Если конфигурация решения передает недопустимое значение, например ARM64 вместо arm64этого, это может привести к недопустимому параметру RID, например win-ARM64.

Использование идентификаторов RID

Для использования идентификаторов RID необходимо знать, какие идентификаторы RID существуют. Последние и полные версии см . в PortableRuntimeIdentifierGraph.json в репозитории dotnet/sdk .

Идентификаторы, которые считаются "переносимыми", то есть не привязаны к определенной версии или дистрибутиву ОС, являются рекомендуемым вариантом. Это означает, что переносимые идентификаторы должны использоваться как для создания приложения для конкретной платформы, так и для создания пакета NuGet с ресурсами, зависящими от RID.

Начиная с .NET 8, поведение пакета SDK для .NET и среды выполнения по умолчанию заключается только в том, чтобы рассмотреть только неконверсивные и неразумные идентификаторы RID. При восстановлении и сборке пакет SDK использует меньший переносимый граф RID. Возвращает RuntimeInformation.RuntimeIdentifierплатформу, для которой была создана среда выполнения. Во время выполнения .NET находит ресурсы, относящиеся к RID, с помощью известного набора переносимых ИДЕНТИФИКАТОРов. При создании приложения с ресурсами, зависящими от RID, которые могут игнорироваться во время выполнения, пакет SDK выдает предупреждение: NETSDK1206.

Загрузка ресурсов для определенной версии ос или дистрибутива

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

Чтобы получить сведения о платформе, используйте System.OperatingSystem API. В Windows и macOS Environment.OSVersion возвращается версия операционной системы. В Linux может быть версия ядра— чтобы получить имя дистрибутива Linux и сведения о версии, рекомендуемый подход — считывать файл /etc/os-release .

.NET предоставляет различные точки расширения для настройки логики загрузки, например , NativeLibrary.SetDllImportResolver(Assembly, DllImportResolver), AssemblyLoadContext.ResolvingUnmanagedDllAssemblyLoadContext.Resolvingи AppDomain.AssemblyResolve. Их можно использовать для загрузки ресурса, соответствующего текущей платформе.

Известные идентификаторы RID

Ниже представлена небольшая выборка наиболее распространенных RID, используемых для каждой ОС. Последние и полные версии см . в PortableRuntimeIdentifierGraph.json в репозитории dotnet/sdk .

Идентификаторы RID для Windows

  • win-x64
  • win-x86
  • win-arm64

Дополнительные сведения см. в статье Зависимости и требования для .NET.

Идентификаторы RID для Linux

  • linux-x64 (большинство дистрибутивов для компьютеров, например CentOS, Debian, Fedora, Ubuntu и производные от них);
  • linux-musl-x64 (упрощенные дистрибутивы, которые используют musl, например Alpine Linux);
  • linux-musl-arm64 (Используется для создания образов Docker для 64-разрядных образов Arm версии 8 и минималистических базовых образов)
  • linux-arm (Дистрибутивы Linux, работающие в Arm, например Raspbian в Raspberry Pi Model 2+)
  • linux-arm64 (Дистрибутивы Linux, работающие на 64-разрядной платформе Arm, например Ubuntu Server 64-разрядной версии в Raspberry Pi Model 3+)
  • linux-bionic-arm64(Дистрибутивы с помощью биография nic libc Android, например Termux)

Дополнительные сведения см. в статье Зависимости и требования для .NET.

Относительные идентификаторы macOS

Относительные идентификаторы macOS используют старую фирменную символику "OSX".

  • osx-x64 (минимальная версия — macOS 10.12 Sierra).
  • osx-arm64

Дополнительные сведения см. в статье Зависимости и требования для .NET.

Идентификаторы RID iOS

  • ios-arm64

Android RIDs

  • android-arm64

См. также