.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 过时警告。 它不会禁用任何其他警告。