API глобального кэша сборок устарели
В .NET Core и .NET 5 и более поздних версий больше не используется концепция глобального кэша сборок, которая присутствует в .NET Framework. Таким образом, все API .NET Core и .NET 5 и более поздних версий, которые используют глобальный кэш сборок, либо завершают работу сбоем, либо не выполняют никаких действий.
Чтобы помочь разработчикам отказаться от этих API, некоторые связанные с глобальным кэшем сборок API были помечены как устаревшие и во время компиляции приводят к созданию предупреждения SYSLIB0005
. В последующей версии .NET эти API могут быть исключены.
Описание изменения
Следующие API помечены как устаревшие.
API | Версия, в которой API помечен как устаревший... |
---|---|
Assembly.GlobalAssemblyCache | 5.0 (RC1) |
В .NET Framework версий с 2.x по 4.x свойство GlobalAssemblyCache возвращает true
, если запрашиваемая сборка была загружена из глобального кэша сборок, и false
, если она была загружена из другого места на диске. В .NET Core версий с 2.x по 3.x свойство GlobalAssemblyCache всегда возвращает false
, указывая, что глобальный кэш сборок в .NET Core не существует.
Assembly asm = typeof(object).Assembly;
// Prints 'True' on .NET Framework, 'False' on .NET Core.
Console.WriteLine(asm.GlobalAssemblyCache);
В .NET 5 и более поздних версий свойство GlobalAssemblyCache также возвращает значение false
. Тем не менее, метод получения для этого свойства также помечен как устаревший. Таким образом, вызывающие объекты информируются, что им не следует в дальнейшем использовать это свойство. Библиотеки и приложения не должны использовать API GlobalAssemblyCache для определения поведения во время выполнения, так как в .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 более не используется концепция глобального кэша сборок.
Представленные версии
.NET 5.0
Рекомендуемое действие
Если приложение запрашивает свойство GlobalAssemblyCache, рассмотрите возможность удалить вызов. Если вы используете значение GlobalAssemblyCache для выбора между потоками сборки в глобальном кэше сборок и вне него во время выполнения, еще раз оцените, актуален ли такой поток в приложении .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. Другие предупреждения не отключаются.