Le API Global Assembly Cache sono obsolete

.NET Core e .NET 5 e versioni successive eliminano il concetto di Global Assembly Cache (GAC) che era presente in .NET Framework. Di conseguenza, tutte le API .NET Core e .NET 5 e versioni successive che gestiscono la GAC hanno esito negativo o non eseguono alcuna operazione.

Per aiutare gli sviluppatori a prendere le distanza da queste API, alcune API correlate alle GAC sono contrassegnate come obsolete e generano un avviso SYSLIB0005 in fase di compilazione. Queste API potrebbero essere rimosse in una versione futura di .NET.

Descrizione delle modifiche

Le API seguenti sono contrassegnate come obsolete.

API Contrassegnata come obsoleta in...
Assembly.GlobalAssemblyCache 5.0 RC1

In .NET Framework 2.x - 4.x, la proprietà GlobalAssemblyCache fornisce true come risultato se l'assembly sottoposto a query è stato caricato dalla GAC e false se è stato caricato da un percorso diverso sul disco. In .NET Core 2.x - 3.x, la proprietà GlobalAssemblyCache fornisce sempre false come risultato, in ciò rispecchiando la non esistenza di GAC in .NET Core.

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

In .NET 5 e versioni successive la proprietà GlobalAssemblyCache continua a fornire false come risultato in ogni evenienza. Tuttavia, anche il getter della proprietà viene contrassegnato come obsoleto per indicare ai chiamanti che devono interrompere l'accesso alla proprietà. Le librerie e le app non devono usare l'API GlobalAssemblyCache per determinare il comportamento in fase di esecuzione, perché in .NET Core e .NET 5 e versioni successive questa fornisce sempre false come risultato.

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

Questa modifica riguarda solo la fase di compilazione. Non è stata apportata alcuna modifica in fase di esecuzione rispetto alle versioni precedenti di .NET Core.

Motivo della modifica

La Global Assembly Cache (GAC) non esiste come concetto in .NET Core e .NET 5 e versioni successive.

Versione introdotta

.NET 5.0

  • Se l'applicazione esegue una query sulla proprietà GlobalAssemblyCache, provare a rimuovere la chiamata. Se si usa il valore GlobalAssemblyCache per scegliere tra un "assembly nel flusso GAC" e un "assembly non nel flusso GAC" in fase di esecuzione, riconsiderare se il flusso ha ancora senso per un'applicazione .NET Core o .NET 5 e versioni successive.

  • Se è necessario continuare a uare le API obsolete, è possibile eliminare l'avviso SYSLIB0005 nel codice.

    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.
    

    È anche possibile eliminare l'avviso nel file di progetto, disabilitandolo così per tutti i file di origine nel progetto.

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

    L'eliminazione di SYSLIB0005 disabilita solo l'avviso GlobalAssemblyCache di obsolescenza. Nessun altro avviso viene disabilitato.

API interessate