Host określa zasoby specyficzne dla identyfikatorów RID

Podczas uruchamiania aplikacji z określonymi elementami zawartości identyfikatora środowiska uruchomieniowego (RID) host określa, jakie zasoby są istotne dla platformy, na której jest uruchomiona. Dotyczy to zarówno samej aplikacji, jak i logiki rozwiązywania używanej przez AssemblyDependencyResolverprogram .

Wcześniej host próbował obliczyć identyfikator RID w czasie wykonywania, a następnie odczytać graf RID, aby określić, które zasoby specyficzne dla identyfikatorów RID są zgodne lub były zgodne z obliczonym identyfikatorem RID. Teraz domyślne zachowanie nie oblicza identyfikatora RID ani nie używa grafu RID. Zamiast tego host opiera się na znanej liście identyfikatorów RID w oparciu o sposób tworzenia samego środowiska uruchomieniowego.

Poprzednie zachowanie

Wcześniej proces wybierania zasobów specyficznych dla identyfikatorów RID był:

  1. Odczytaj graf RID z pliku .deps.json struktury głównej (Microsoft.NetCore.App).
  2. Oblicz bieżące identyfikatory RID w czasie wykonywania i spróbuj znaleźć wpis w grafie RID. Jeśli nie istnieje, sprawdź rezerwowe identyfikatory RID (wbudowane w hosta w czasie kompilacji).
  3. Począwszy od wpisu znalezionego na grafie RID, poszukaj zasobów pasujących do tego identyfikatora RID.
  4. Kontynuuj dół listy identyfikatorów RID we wpisie grafu RID, dopóki nie zostanie znalezione dopasowanie zasobu lub lista się kończy.

Jeśli graf RID nie ma obliczonego identyfikatora RID lub rezerwowego identyfikatora RID, zasoby rid nie zostały prawidłowo rozwiązane.

Nowe zachowanie

Domyślnie proces nie opiera się już na grafie RID. Zamiast tego sprawdza znany zestaw przenośnych identyfikatorów RID w oparciu o sposób tworzenia hosta. Na przykład:

Linux

  • linux-x64
  • linux
  • unix-x64
  • Unix
  • dowolny

Windows

  • win-x64
  • Wygrać
  • dowolny

macOS

  • osx-x64
  • Osx
  • unix-x64
  • Unix

W przypadku kompilacji innych niż przenośne hostów lub środowiska uruchomieniowego kompilacja może również ustawić nieodnośny identyfikator RID, który jest sprawdzany jako pierwszy.

Wprowadzona wersja

.NET 8 (wersja zapoznawcza 5)

Typ zmiany powodującej niezgodność

Ta zmiana może mieć wpływ na zgodność binarną i jest również zmianą behawioralną.

Przyczyna wprowadzenia zmiany

Graf RID był kosztowny do utrzymania i zrozumienia, wymagając, aby platforma .NET była świadoma dystrybucji w kruchy sposób. Zespół platformy .NET i społeczność poświęcają nietrywialny czas na aktualizowanie grafu i importowanie takich aktualizacji do poprzednich wersji. Długoterminowym celem jest zatrzymanie aktualizowania grafu RID, zatrzymywanie odczytywania go i usuwanie go w końcu. Ta zmiana powodująca niezgodność jest krokiem w kierunku tego celu.

Użyj przenośnych identyfikatorów ZAREZERWOWANYch, na przykład linux, , linux-muslosxi win. W przypadku wyspecjalizowanych przypadków użycia można użyć interfejsów API, takich jak NativeLibrary.SetDllImportResolver(Assembly, DllImportResolver) lub AssemblyLoadContext.ResolvingUnmanagedDll dla niestandardowej logiki ładowania.

Jeśli chcesz przywrócić poprzednie zachowanie, ustaw przełącznik System.Runtime.Loader.UseRidGraph zgodności wstecz na true w pliku runtimeconfig.json . Ustawienie przełącznika na true polecenie nakazuje hostowi użycie poprzedniego zachowania odczytu grafu RID. Alternatywnie możesz ustawić UseRidGraph właściwość MSBuild na true w pliku projektu. Na przykład

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

Dotyczy interfejsów API

Zobacz też