Share via


As APIs de cache de assembly global estão obsoletas

O .NET Core, o .NET 5 e as versões posteriores eliminam o conceito de GAC (cache de assembly global) que estava presente no .NET Framework. Dessa forma, todas as APIs .NET Core e .NET 5+ que lidam com o GAC falham ou não executam nenhuma operação.

Para ajudar a afastar os desenvolvedores dessas APIs, algumas APIs relacionadas ao GAC são marcadas como obsoletas e geram um aviso SYSLIB0005 no tempo de compilação. Essas APIs poderão ser removidas em uma versão futura do .NET.

Descrição das alterações

As APIs a seguir estão marcadas como obsoletas.

API Marcada como obsoleta em...
Assembly.GlobalAssemblyCache 5.0 RC1

No .NET Framework 2.x - 4.x, a propriedade GlobalAssemblyCache retornará true se o assembly consultado tiver sido carregado do GAC, e false se ele tiver sido carregado de um local diferente no disco. No .NET Core 2.x - 3.x, o GlobalAssemblyCache sempre retorna false, refletindo que o GAC não existe no .NET Core.

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

No .NET 5 e versões posteriores, a propriedade GlobalAssemblyCache continua sempre retornando false. No entanto, o getter de propriedade também é marcado como obsoleto para indicar aos chamadores que eles devem parar de acessar a propriedade. Bibliotecas e aplicativos não devem usar a API GlobalAssemblyCache para fazer determinações sobre o comportamento em tempo de execução, porque ela sempre retornará false no .NET Core e no .NET 5 e versões posteriores.

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

Essa é uma alteração somente de tempo de compilação. Não há nenhuma alteração em tempo de execução das versões anteriores do .NET Core.

Motivo da alteração

O GAC (cache de assembly global) não existe como um conceito no .NET Core e no .NET 5 e versões posteriores.

Versão introduzida

.NET 5.0

  • Se o aplicativo consultar a propriedade GlobalAssemblyCache, considere remover a chamada. Se você usar o valor GlobalAssemblyCache para escolher entre um fluxo de "assembly no GAC" versus um fluxo de "assembly que não está no GAC" em tempo de execução, reconsidere se o fluxo ainda é o ideal para um aplicativo .NET Core ou .NET 5+.

  • Se você precisar continuar a usar as APIs obsoletas, suprima o aviso SYSLIB0005 no código.

    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.
    

    Você também pode suprimir o aviso no arquivo de projeto, o que desabilita o aviso para todos os arquivos de origem no projeto.

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

    Suprimir SYSLIB0005 desabilita apenas o aviso de obsolescência GlobalAssemblyCache. Ela não desabilita nenhum outro aviso.

APIs afetadas