全局程序集缓存 API 已过时

.NET Core 和 .NET 5 及更高版本消除了 .NET Framework 中存在的全局程序集缓存 (GAC)的概念。 因此,处理 GAC 的所有 .NET Core 和 .NET 5+ API 要么失败,要么不执行任何作。

为了帮助开发人员远离这些 API,某些 GAC 相关的 API 标记为已过时,并在编译时生成 SYSLIB0005 警告。 将来的 .NET 版本中可能会删除这些 API。

更改描述

以下 API 标记为已过时。

API(应用程序编程接口) 在以下版本中标记为已过时…
Assembly.GlobalAssemblyCache 5.0 RC1

在 .NET Framework 2.x - 4.x 中,GlobalAssemblyCache属性返回true,如果查询的程序集是从 GAC 加载的;如果该程序集是从磁盘上的其他位置加载的,则返回false。 在 .NET Core 2.x - 3.x 中, GlobalAssemblyCache 始终返回 false,反映 .NET Core 中不存在 GAC。

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 与以前版本相比没有运行时更改。

更改原因

全局程序集缓存 (GAC) 在 .NET Core 和 .NET 5 及更高版本中不存在作为概念。

已引入的版本

.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