Catálogo de identificadores de entorno de ejecución (RID) de .NET
RID es la abreviatura en inglés de identificador de runtime. Los valores de RID se usan para identificar las plataformas de destino donde se ejecuta la aplicación.
Los paquetes de .NET los usan para presentar los recursos específicos de la plataforma en los paquetes de NuGet. Los valores siguientes son ejemplos de RID: linux-x64
, win-x64
, o osx-x64
.
En el caso de los paquetes con dependencias nativas, el RID designa las plataformas en las que se puede restauran el paquete.
Un único RID se puede establecer en el elemento <RuntimeIdentifier>
del archivo del proyecto. Se pueden definir varios RID como una lista delimitada por punto y coma en el elemento <RuntimeIdentifiers>
del archivo del proyecto. También se usan mediante la opción --runtime
con los comandos de la CLI de .NET siguientes:
Los RID que representan sistemas operativos concretos normalmente siguen este patrón: [os].[version]-[architecture]-[additional qualifiers]
, donde:
[os]
es el moniker del sistema operativo o de plataforma. Por ejemplo:ubuntu
.[version]
es la versión del sistema operativo en formato de número de versión separado por punto (.
). Por ejemplo:15.10
.La versión no debe ser una versión de marketing, ya que estas representan a menudo varias versiones discretas del sistema operativo con diferentes áreas expuestas de las API de plataforma.
[architecture]
es la arquitectura de procesador. Por ejemplo:x86
,x64
,arm
oarm64
.[additional qualifiers]
diferencia aún más las distintas plataformas. Por ejemplo:aot
.
Grafo de RID
El grado de RID o el grafo de reserva de entorno de ejecución es una lista de RID compatibles entre sí.
Estos RID se definen en PortableRuntimeIdentifierGraph.json en el dotnet/runtime
repositorio. En este archivo puede ver que todos los RID, excepto el RID de base, contienen una instrucción "#import"
. Estas instrucciones indican los RID compatibles.
Antes de .NET 8, los RID específicos de la versión y específicos de la distribución se agregaron regularmente al archivo runtime.json, que se encuentra en el repositoriodotnet/runtime
. Este gráfico ya no se actualiza y existe como opción de compatibilidad con versiones anteriores. Los desarrolladores deben usar RID que no sean específicos de la versión y que no sean específicosde la distribución.
Cuando NuGet restaura los paquetes, intenta encontrar una coincidencia exacta para el entorno de ejecución especificado. Si no se encuentra una coincidencia exacta, NuGet vuelve al grafo hasta encontrar el sistema compatible más cercano según el grafo de RID.
El ejemplo siguiente es la entrada real del RID osx-x64
:
"osx-x64": {
"#import": [ "osx", "unix-x64" ]
}
El RID anterior especifica que osx-x64
importa unix-x64
. Por tanto, cuando NuGet restaura los paquetes, intenta encontrar una coincidencia exacta para osx-x64
en el paquete. Si NuGet no puede encontrar el entorno de ejecución específico, puede restaurar, por ejemplo, los paquetes que especifican entornos de ejecución unix-x64
.
En el ejemplo siguiente se muestra un grafo de RID ligeramente más grande que también se define en el archivo runtime.json:
linux-arm64 linux-arm32
| \ / |
| linux |
| | |
unix-arm64 | unix-x64
\ | /
unix
|
any
Como alternativa, puede usar la herramienta RidGraph para visualizar fácilmente el gráfico RID (o cualquier subconjunto del gráfico).
A la larga, todos los RID se asignarán de vuelta al RID any
raíz.
Hay algunas consideraciones sobre los RID que debe tener en cuenta cuando trabaja con ellos:
No intente analizar los RID para recuperar partes de componentes.
Use RID que ya estén definidos para la plataforma.
Los RID deben ser específicos, por lo que no se recomienda presuponer nada a partir del valor de RID real.
No compile RID mediante programación a menos que sea absolutamente necesario.
Algunas aplicaciones necesitan calcular los RID mediante programación. Si es así, los RID calculados deben coincidir exactamente con el catálogo, incluido el uso de las mayúsculas. Los RID con un uso distinto de las mayúsculas traerían problemas cuando el SO distinga mayúsculas de minúsculas, como Linux, ya que el valor se usa a menudo al construir elementos como las rutas de salida. Por ejemplo, considere un asistente de publicación personalizado en Visual Studio que se base en información del administrador de configuración de la solución y en las propiedades del proyecto. Si la configuración de la solución pasa un valor no válido, por ejemplo,
ARM64
en lugar dearm64
, podría dar lugar a un RID no válido, comowin-ARM64
.
Uso de los RID
Para poder usar los RID, debe saber cuáles son los RID que existen. Para obtener la versión más reciente y completa, consulte PortableRuntimeIdentifierGraph.json en el dotnet/runtime
repositorio.
Los RID que se consideran "portátiles" (es decir, no están vinculados a una versión específica o distribución del sistema operativo) son la opción recomendada. Esto significa que se deben usar RID portátiles para compilar una aplicación específica de la plataforma y crear un paquete NuGet con recursos específicos de RID.
A partir de .NET 8, el comportamiento predeterminado del SDK y el entorno de ejecución de .NET es considerar solo los RID no específicos de la versión y no específicos de la distribución. Al restaurar y compilar, el SDK usa un gráficoRID portátil más pequeño. El RuntimeInformation.RuntimeIdentifier devuelve la plataforma para la que se construyó el tiempo de ejecución. En tiempo de ejecución, .NET busca recursos específicos de RID mediante un conjunto conocido de RIDportátiles. Al compilar una aplicación con recursos específicos de RID que se pueden omitir en tiempo de ejecución, el SDK emitirá una advertencia: NETSDK1206.
Carga de recursos para una versión o distribución específicas del sistema operativo
.NET ya no intenta proporcionar compatibilidad de primera clase para resolver dependencias específicas de una versión o distribución del sistema operativo. Si la aplicación o el paquete deben cargar recursos diferentes en función de la versión o distribución del sistema operativo, debe implementar la lógica para cargar recursos de forma condicional.
Para obtener información sobre la plataforma, use System.OperatingSystem las API. En Windows y macOS, Environment.OSVersion devolverá la versióndel sistema operativo. En Linux, puede ser la versión del kernel: para obtener el nombre de la distribución de Linux y la información de la versión, el enfoque recomendado es leer el archivo /etc/os-release.
.NET proporciona varios puntos de extensión para personalizar la lógica de carga, por ejemplo, NativeLibrary.SetDllImportResolver(Assembly, DllImportResolver), AssemblyLoadContext.ResolvingUnmanagedDll, AssemblyLoadContext.Resolvingy AppDomain.AssemblyResolve. Se pueden usar para cargar el recurso correspondiente a la plataforma actual.
RID conocidos
En la lista siguiente se muestra un pequeño subconjunto de los RID más comunes que se usan con cada sistema operativo. Para obtener la versión más reciente y completa, consulte PortableRuntimeIdentifierGraph.json en el dotnet/runtime
repositorio.
RID de Windows
win-x64
win-x86
win-arm64
Para más información, consulte Instalación de .NET en Windows.
RID de Linux
linux-x64
(La mayoría de las distribuciones de escritorio como CentOS Stream, Debian, Fedora, Ubuntu y derivados)linux-musl-x64
(Distribuciones ligeras con musl como Alpine Linux)linux-musl-arm64
(Se usa para compilar imágenes de Docker para imágenes base de Arm v8 de 64 bits y minimalistas)linux-arm
(Distribuciones de Linux que se ejecutan en ARM, como Raspbian en Raspberry Pi, modelo 2+)linux-arm64
(Distribuciones de Linux que se ejecutan en ARM de 64 bits, como Ubuntu Server de 64 bits en Raspberry Pi, modelo 3+)linux-bionic-arm64
(Distribuciones que usan libc biónico de Android; por ejemplo, Termux)linux-loongarch64
(Distribuciones de Linux que se ejecutan en LoongArch64)
Para obtener más información, vea Dependencias y requisitos de .NET.
RID de macOS
Los RID de macOS usan la personalización de marca antigua "OSX".
osx-x64
(La versión mínima del sistema operativo es macOS 10.12 Sierra)osx-arm64
Para obtener más información, vea Dependencias y requisitos de .NET.
RID de iOS
ios-arm64
iossimulator-arm64
iossimulator-x64
RID de Android
android-arm64
android-arm
android-x64
android-x86