全域組件快取 API 已淘汰

.NET Core 和 .NET 5 及更新版本消除了存在於 .NET Framework 中的全域組件快取 (GAC) 概念。 因此,處理 GAC 的所有 .NET Core 和 .NET 5+ API 都會失敗或不執行任何作業。

為了協助讓開發人員遠離這些 API,某些 GAC 相關 API 會標記為已淘汰,並且在編譯時期產生 SYSLIB0005 警告。 這些 API 可能會在 .NET 的未來版本中移除。

變更描述

下列 API 標記為已淘汰。

API 標示為已淘汰...
Assembly.GlobalAssemblyCache 5.0 RC1

在 .NET Framework 2.x - 4.x 中,如果查詢的組件是從 GAC 載入,則 GlobalAssemblyCache 屬性會傳回 true,但如果是從磁碟上的其他位置載入,則會傳回 false。 在 .NET Core 2.x - 3.x 中,GlobalAssemblyCache 一律會傳回 false,反映 GAC 不存在於 .NET Core 中。

Assembly asm = typeof(object).Assembly;
// Prints 'True' on .NET Framework, 'False' on .NET Core.
Console.WriteLine(asm.GlobalAssemblyCache);

在 .NET 5 和更新版本中,GlobalAssemblyCache 屬性會繼續一律傳回 false。 不過,屬性 getter 也會標記為已淘汰,以向呼叫者指出應該停止存取該屬性。 程式庫和應用程式不應該使用 GlobalAssemblyCache API 來判斷執行階段行為,因為其在 .NET Core 和 .NET 5 及更新版本中一律會傳回 false

Assembly asm = typeof(object).Assembly;
// Prints 'False' on .NET 5+; also produces warning SYSLIB0005 at compile time.
Console.WriteLine(asm.GlobalAssemblyCache);

此變更僅限編譯時期。 舊版 .NET Core 沒有執行階段變更。

變更原因

在 .NET Core 和 .NET 5 及更新版本中,不存在全域組件快取 (GAC) 的概念。

導入的版本

.NET 5.0

  • 如果您的應用程式查詢 GlobalAssemblyCache 屬性,請考慮移除呼叫。 如果您使用 GlobalAssemblyCache 值來選擇「GAC 中的組件」流程與執行階段「不在 GAC 中的組件」流程,請重新考慮流程對 .NET Core 或 .NET 5+ 應用程式是否仍然有意義。

  • 若您必須繼續使用已淘汰的 API,則可在程式碼中隱藏 SYSLIB0005 警告。

    Assembly asm = typeof(object).Assembly;
    #pragma warning disable SYSLIB0005 // Disable the warning.
    // Prints 'False' on .NET 5+.
    Console.WriteLine(asm.GlobalAssemblyCache);
    #pragma warning restore SYSLIB0005 // Re-enable the warning.
    

    您也可隱藏專案檔中的警告,如此會停用專案中所有來源檔案的警告。

    <Project Sdk="Microsoft.NET.Sdk">
      <PropertyGroup>
       <TargetFramework>net5.0</TargetFramework>
       <!-- NoWarn below will suppress SYSLIB0005 project-wide -->
       <NoWarn>$(NoWarn);SYSLIB0005</NoWarn>
      </PropertyGroup>
    </Project>
    

    隱藏 SYSLIB0005 只會停用 GlobalAssemblyCache 淘汰警告, 而不會停用其他任何警告。

受影響的 API