主機會決定 RID 特定資產
當執行具有執行階段識別碼 (RID) 特定資產的應用程式時,主機會決定哪些資產與其執行的平台相關。 這適用於應用程式本身和 AssemblyDependencyResolver 使用的解析邏輯。
之前,主機會嘗試在執行階段計算 RID,然後讀取 RID 圖形以確定哪些 RID 特定資產與計算的 RID 相符或相容。 現在,預設行為不會計算 RID 或使用 RID 圖形。 相反地,主機會根據執行階段本身的建置方式,依賴已知的 RID 清單。
先前的行為
之前選取 RID 特定資產的程序如下:
- 從根架構的 .deps.json 檔案讀取 RID 圖形 (Microsoft.NetCore.App)。
- 在執行階段計算目前的 RID,並嘗試在 RID 圖形中尋找項目。 如果不存在,請檢查是否有後援 RID (在編譯時間內建在主機中)。
- 從 RID 圖形中找到的項目開始,尋找符合該 RID 的資產。
- 繼續沿著 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,例如 linux
、linux-musl
、osx
和 win
。 針對特殊使用案例,您可以使用類似 NativeLibrary.SetDllImportResolver(Assembly, DllImportResolver) 或 AssemblyLoadContext.ResolvingUnmanagedDll 的 API 來自訂載入邏輯。
如果您需要還原為之前的行為,請將 runtimeconfig.json 檔案中的回溯相容性參數 System.Runtime.Loader.UseRidGraph
設定為 true
。 將參數設定為 true
會指示主機使用之前讀取 RID 圖形的行為。 或者,您可以將專案檔中的 UseRidGraph
MSBuild 屬性設定為 true
。 例如:
<PropertyGroup>
<UseRidGraph>true</UseRidGraph>
</PropertyGroup>