Condividi tramite


Denominazione sicura

La creazione di nomi sicuri si riferisce alla firma di un assembly con una chiave, per produrre un assembly con nome sicuro. Quando un assembly ha un nome sicuro, viene creata un'identità univoca basata sul nome e sul numero di versione dell'assembly e ciò può aiutare a evitare i conflitti di assembly.

Lo svantaggio del nome sicuro è che .NET Framework in Windows abilita il caricamento di un assembly solo quando ha un nome sicuro. Poiché un riferimento a un assembly con nome sicuro deve corrispondere esattamente alla versione dell'assembly caricato, gli sviluppatori sono costretti a configurare reindirizzamenti del binding quando usano l'assembly:

<configuration>
   <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
         <dependentAssembly>
            <assemblyIdentity name="myAssembly" publicKeyToken="32ab4ba45e0a69a1" culture="neutral" />
            <bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0"/>
         </dependentAssembly>
      </assemblyBinding>
   </runtime>
</configuration>

Quando gli sviluppatori .NET si lamentano dei nomi sicuri, in realtà ciò che non apprezzano è il caricamento degli assembly in modalità strict. Fortunatamente, questo problema è presente solo in .NET Framework. .NET 5+, .NET Core, Xamarin, la piattaforma UWP e la maggior parte delle altre implementazioni di .NET non impongono limitazioni sul caricamento degli assembly. Questo è il principale svantaggio del nome sicuro.

Un aspetto importante del nome sicuro in .NET Framework è il fatto che è virale. Un assembly con nome sicuro può fare infatti riferimento solo ad altri assembly con nome sicuro. Se la libreria in uso non ha un nome sicuro, le app e le librerie di .NET Framework che richiedono un nome sicuro non possono usarla.

I vantaggi del nome sicuro in .NET Framework sono:

  1. Altri assembly con nome sicuro possono fare riferimento all'assembly e usarlo.
  2. L'assembly può essere archiviato nella Global Assembly Cache (GAC).
  3. L'assembly può essere caricato affiancato ad altre versioni dell'assembly. Il caricamento dell'assembly affiancato è comunemente richiesto dalle applicazioni con architetture plug-in.

Il nome sicuro non offre vantaggi in .NET Core/5+. Il compilatore C# genera un avviso CS8002 per gli assembly con nome sicuro che fanno riferimento ad assembly senza nome sicuro. È possibile ignorare questo avviso per le librerie destinate solo a .NET Core/5+.

Creare librerie .NET con nome sicuro

È consigliabile assegnare un nome sicuro alle librerie .NET open source se le loro destinazioni includono .NET Framework o .NET Standard. Il nome sicuro non è necessario per le librerie destinate solo a .NET Core/5+.

Nota

Queste indicazioni si riferiscono alle librerie .NET distribuite pubblicamente, ad esempio le librerie .NET pubblicate in NuGet.org. Il nome sicuro non è richiesto dalla maggior parte delle applicazioni .NET e non deve essere usato per impostazione predefinita.

✔️ VALUTARE l'uso di nomi sicuri per gli assembly della libreria.

✔️ VALUTARE l'aggiunta della chiave per la creazione di nomi sicuri nel sistema di controllo del codice sorgente.

Una chiave disponibile pubblicamente consente agli sviluppatori di modificare e ricompilare il codice sorgente della libreria con la stessa chiave.

Non rendere pubblica la chiave per la creazione di nomi sicuri se è stata usata in precedenza per concedere autorizzazioni speciali in scenari di attendibilità parziale. In caso contrario, si potrebbero compromettere gli ambienti esistenti.

Importante

Quando si vuole indicare l'identità dell'editore del codice, usare Authenticode e la firma di pacchetti NuGet. Non usare la sicurezza dall'accesso di codice come prevenzione per la sicurezza.

✔️ VALUTARE l'incremento della versione dell'assembly solo per le modifiche di versione principale, per aiutare gli utenti a ridurre i reindirizzamenti di binding e la frequenza di aggiornamento.

Leggere altre informazioni su controllo delle versioni e versione degli assembly.

❌ NON aggiungere, rimuovere o modificare la chiave del nome sicuro.

Se si modifica una chiave per la creazione di nomi sicuri di un assembly, viene modificata l'identità dell'assembly e il codice compilato che lo usa non funziona più. Per altre informazioni, vedere Binary breaking change (Modifica che causa un'interruzione del codice binario).

❌ NON pubblicare versioni con nome sicuro e senza nome sicuro della libreria. Ad esempio, Contoso.Api e Contoso.Api.StrongNamed.

La pubblicazione di due pacchetti comporta la biforcazione dell'ecosistema di sviluppo. Se un'applicazione dipende da entrambi i pacchetti, inoltre, possono verificarsi conflitti di nomi di tipo. Per quanto riguarda .NET, si tratta di tipi diversi in assembly diversi.