分享方式:


主機會決定 RID 特定資產

當執行具有執行階段識別碼 (RID) 特定資產的應用程式時,主機會決定哪些資產與其執行的平台相關。 這適用於應用程式本身和 AssemblyDependencyResolver 使用的解析邏輯。

之前,主機會嘗試在執行階段計算 RID,然後讀取 RID 圖形以確定哪些 RID 特定資產與計算的 RID 相符或相容。 現在,預設行為不會計算 RID 或使用 RID 圖形。 相反地,主機會根據執行階段本身的建置方式,依賴已知的 RID 清單。

先前的行為

之前選取 RID 特定資產的程序如下:

  1. 從根架構的 .deps.json 檔案讀取 RID 圖形 (Microsoft.NetCore.App)。
  2. 在執行階段計算目前的 RID,並嘗試在 RID 圖形中尋找項目。 如果不存在,請檢查是否有後援 RID (在編譯時間內建在主機中)。
  3. 從 RID 圖形中找到的項目開始,尋找符合該 RID 的資產。
  4. 繼續沿著 RID 圖形項目中的 RID 清單向下移動,直到找到資產相符項目或清單結束為止。

如果 RID 圖形沒有計算的 RID 或後援 RID,RID 資產就不會正確解析。

新的行為

根據預設,程序不再依賴 RID 圖形。 相反地,它會根據主機的建置方式檢查一組已知的可攜式 RID。 例如:

Linux

  • linux-x64
  • linux
  • unix-x64
  • unix
  • 任意

Windows

  • win-x64
  • win
  • 任意

macOS

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

針對主機或執行階段的非可攜式組建,組建可能也會設定會先檢查的非可攜式 RID。

導入的版本

.NET 8 Preview 5

中斷性變更的類型

這項變更可能會影響二進位相容性,同時也是一項行為變更

變更原因

RID 圖形的維護與理解成本高昂,要求 .NET 本身以脆弱的方式進行發行版感知。 .NET 小組和社群會花一些時間更新圖形,並將這類更新備份至舊版。 長期目標是停止更新 RID 圖形、停止讀取它,最終將其移除。 這項中斷性變更是邁向目標的一步。

使用可攜式 RID,例如 linuxlinux-muslosxwin。 針對特殊使用案例,您可以使用類似 NativeLibrary.SetDllImportResolver(Assembly, DllImportResolver)AssemblyLoadContext.ResolvingUnmanagedDll 的 API 來自訂載入邏輯。

如果您需要還原為之前的行為,請將 runtimeconfig.json 檔案中的回溯相容性參數 System.Runtime.Loader.UseRidGraph 設定為 true。 將參數設定為 true 會指示主機使用之前讀取 RID 圖形的行為。 或者,您可以將專案檔中的 UseRidGraph MSBuild 屬性設定為 true。 例如:

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

受影響的 API

另請參閱