Determinación de los recursos específicos de RID por el host

Al ejecutar una aplicación con recursos específicos del identificador en tiempo de ejecución (RID), el host determina qué recursos son relevantes para la plataforma en la que se ejecuta. Esto se aplica tanto a la propia aplicación como a la lógica de resolución usada por AssemblyDependencyResolver.

Anteriormente, el host intentó calcular el RID en tiempo de ejecución y, a continuación, leyó el grafo de RID para determinar qué recursos específicos de RID coinciden o eran compatibles con el RID calculado. Ahora, el comportamiento predeterminado no calcula el RID ni usa el grafo de RID. En su lugar, el host se basa en una lista conocida de RID en función de cómo se creó el propio entorno de ejecución.

Comportamiento anterior

Anteriormente, el proceso para seleccionar recursos específicos de RID era:

  1. Leer el grafo de RID del archivo .deps.json del marco raíz (Microsoft.NetCore.App).
  2. Calcular el RID actual en tiempo de ejecución e intentar encontrar una entrada para él en el grafo de RID. Si no existe, comprobar si hay un RID de reserva (integrado en el host en tiempo de compilación).
  3. A partir de la entrada que se encuentra en el grafo de RID, buscar recursos que coincidan con ese RID.
  4. Continuar con la lista de RID en la entrada del grafo de RID hasta que se encuentre una coincidencia de recursos o finalice la lista.

Si el grafo de RID no tenía el RID calculado o el RID de reserva, los recursos de RID no se resolvieron correctamente.

Comportamiento nuevo

De forma predeterminada, el proceso ya no se basa en el grafo de RID. En su lugar, comprueba si hay un conjunto conocido de RID portátiles en función de cómo se creó el host. Por ejemplo:

Linux

  • linux-x64
  • Linux
  • unix-x64
  • unix
  • cualquiera

Windows

  • win-x64
  • win
  • cualquiera

macOS

  • osx-x64
  • osx
  • unix-x64
  • unix

En el caso de compilaciones no portátiles del host o el entorno de ejecución, la compilación también podría establecer un RID no portátil que se compruebe primero.

Versión introducida

.NET 8 (versión preliminar 5)

Tipo de cambio importante

Este cambio puede afectar a la compatibilidad de binaria y también es un cambio de comportamiento.

Motivo del cambio

El grafo de RID era costoso de mantener y comprender, y requería que el propio .NET fuera compatible con la distribución de una manera frágil. El equipo de .NET y la comunidad dedican una cantidad de tiempo no trivial a actualizar el grafo y volver a importar dichas actualizaciones a versiones anteriores. El objetivo a largo plazo es detener la actualización del grafo de RID, dejar de leerlo y, finalmente, quitarlo. Este cambio importante es un paso hacia ese objetivo.

Use RID portátiles, por ejemplo, linux, linux-musl, osx y win. Para casos de uso especializados, puede usar API como NativeLibrary.SetDllImportResolver(Assembly, DllImportResolver) o AssemblyLoadContext.ResolvingUnmanagedDll para la lógica de carga personalizada.

Si necesita revertir al comportamiento anterior, establezca el modificador de compatibilidad con versiones anteriores System.Runtime.Loader.UseRidGraph en true en el archivo runtimeconfig.json. Al establecer el modificador en true se indica al host que use el comportamiento anterior de lectura del grafo de RID. Alternativamente, puede establecer la UseRidGraph propiedad MSBuild a en true su archivo de proyecto. Por ejemplo

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

API afectadas

Consulte también