O host determina ativos específicos do RID
Ao executar um aplicativo com ativos específicos de identificador de tempo de execução (RID), o host determina quais ativos são relevantes para a plataforma na qual ele está sendo executado. Isto aplica-se tanto à aplicação em si como à lógica de resolução utilizada pela AssemblyDependencyResolver.
Anteriormente, o host tentou calcular o RID em tempo de execução e, em seguida, ler o gráfico do RID para determinar quais ativos específicos do RID correspondiam ou eram compatíveis com o RID calculado. Agora, o comportamento padrão não calcula o RID nem usa o gráfico RID. Em vez disso, o host depende de uma lista conhecida de RIDs com base em como o próprio tempo de execução foi construído.
Comportamento anterior
Anteriormente, o processo de seleção de ativos específicos do RID era:
- Leia o gráfico RID do arquivo .deps.json da estrutura raiz (Microsoft.NetCore.App).
- Calcule o RID atual em tempo de execução e tente encontrar uma entrada para ele no gráfico RID. Se ele não existir, verifique se há um RID de fallback (incorporado ao host em tempo de compilação).
- A partir da entrada encontrada no gráfico RID, procure ativos correspondentes a esse RID.
- Continue descendo a lista de RIDs na entrada do gráfico RID até que uma correspondência de ativos seja encontrada ou a lista termine.
Se o gráfico RID não tiver o RID computado ou o RID de fallback, os ativos RID não foram resolvidos corretamente.
Novo comportamento
Por padrão, o processo não depende mais do gráfico RID. Em vez disso, ele verifica um conjunto conhecido de RIDs portáteis com base em como o host foi construído. Por exemplo:
Linux
- Linux-X64
- linux
- UNIX-X64
- UNIX
- qualquer
Windows
- win-x64
- vitória
- qualquer
macOS
- OSX-X64
- OSX
- UNIX-X64
- UNIX
Para compilações não portáteis do host ou do tempo de execução, a compilação também pode definir um RID não portátil que é verificado primeiro.
Versão introduzida
.NET 8 Visualização 5
Tipo de mudança de rutura
Esta alteração pode afetar a compatibilidade binária e é também uma mudança comportamental.
Razão para a alteração
O gráfico RID era caro para manter e entender, exigindo que o próprio .NET estivesse ciente da distro de uma maneira frágil. A equipe do .NET e a comunidade gastam uma quantidade não trivial de tempo atualizando o gráfico e fazendo backporting dessas atualizações para versões anteriores. O objetivo a longo prazo é parar de atualizar o gráfico RID, parar de lê-lo e, eventualmente, removê-lo. Esta mudança revolucionária é um passo em direção a esse objetivo.
Ação recomendada
Use RIDs portáteis, por exemplo, linux
, linux-musl
, osx
, e win
. Para casos de uso especializados, você pode usar APIs como NativeLibrary.SetDllImportResolver(Assembly, DllImportResolver) ou AssemblyLoadContext.ResolvingUnmanagedDll para lógica de carregamento personalizada.
Se você precisar reverter para o comportamento anterior, defina a opção System.Runtime.Loader.UseRidGraph
de compatibilidade com versões anteriores como true
no arquivo runtimeconfig.json . A configuração do switch para true
instrui o host a usar o comportamento anterior de leitura do gráfico RID. Como alternativa, você pode definir a UseRidGraph
propriedade MSBuild como true
em seu arquivo de projeto. Por exemplo
<PropertyGroup>
<UseRidGraph>true</UseRidGraph>
</PropertyGroup>