Nomenclatura forte
Nomenclatura forte refere-se a assinar um assembly com uma chave, produzindo um assembly de nome forte. Quando um assembly tem um nome forte, ele cria uma identidade exclusiva com base no número de versão de nome e assembly e pode ajudar a evitar conflitos de assembly.
A desvantagem de dar um nome forte é que o .NET Framework no Windows habilita carregamento estrito de assemblies depois que um assembly recebe um nome forte. Uma referência de assembly de nome forte deve corresponder exatamente à versão do assembly carregado, forçando os desenvolvedores a configurar redirecionamentos de associação ao usar o 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 os desenvolvedores do .NET reclamam sobre nomenclatura forte, eles normalmente reclamam de carregamento estrito do assembly. Felizmente, esse problema é isolado para o .NET Framework. .NET 5+, .NET Core, Xamarin, UWP e a maioria das outras implementações do .NET, não têm carregamento do assembly estrito, que é a principal desvantagem da nomenclatura forte.
Um aspecto importante da nomenclatura forte no .NET Framework é que ela é viral: um assembly com nome forte só pode referenciar outros assemblies com nome forte. Se sua biblioteca não tiver um nome forte, os aplicativos e as bibliotecas do .NET Framework que precisam de nomenclatura forte não poderão usá-la.
Os benefícios da nomenclatura forte no .NET Framework são os seguintes:
- O assembly pode ser referenciado e usado por outros assemblies de nome forte.
- O assembly pode ser armazenado no GAC (Cache de Assembly Global).
- O assembly pode ser carregado lado a lado com outras versões do assembly. Carregamento do assembly lado a lado é normalmente exigido por aplicativos com arquiteturas de plug-in.
A nomenclatura forte não tem benefícios no .NET Core/5+. O compilador C# produz um aviso CS8002 para assemblies com nomes fortes que fazem referência a assemblies sem nomes fortes. Não há problema em suprimir esse aviso para bibliotecas que têm como destino apenas o .NET Core/5+.
Crie bibliotecas .NET de nome forte
Você deve dar nomes fortes às suas bibliotecas .NET de código aberto se seus destinos incluírem o .NET Framework ou o .NET Standard. A nomenclatura forte não é necessária para bibliotecas que têm como destino apenas o .NET Core/5+.
Observação
Essas diretrizes são específicas para bibliotecas do .NET distribuídas publicamente, como bibliotecas do .NET publicadas em NuGet.org. A nomenclatura forte não é necessária para a maioria dos aplicativos .NET e não deve ser feita por padrão.
✔️ CONSIDERE dar um nome forte aos assemblies da sua biblioteca.
✔️ CONSIDERE adicionar a chave de nome forte ao seu sistema de controle do código-fonte.
Uma chave disponível publicamente permite aos desenvolvedores modificar e recompilar o código-fonte da biblioteca com a mesma chave.
Você não deverá tornar pública a chave de nome forte se ela tiver sido usada anteriormente para conceder permissões especiais em cenários de confiança parcial. Caso contrário, você poderá comprometer ambientes existentes.
Importante
Quando a identidade do editor do código for desejada, Authenticode e Assinatura de Pacote do NuGet são recomendados. CAS (Segurança de Acesso do Código) não deve ser usada como uma mitigação de segurança.
✔️ CONSIDERE incrementar a versão do assembly nas alterações de versão principal somente para ajudar os usuários a reduzir os redirecionamentos de associação e a frequência com que eles sejam atualizados.
Leia mais sobre controle de versão e versão do assembly.
❌ NÃO adicione, remova nem altere a chave de nome forte.
Modificar a chave de nome forte do assembly muda a identidade do assembly e interrompe o código compilado que a utiliza. Para obter mais informações, veja alterações interruptivas binárias.
❌ NÃO publicar versões de nome forte e sem nome forte da biblioteca. Por exemplo, Contoso.Api
e Contoso.Api.StrongNamed
.
Publicar dois pacotes bifurca o ecossistema do desenvolvedor. Além disso, se um aplicativo acabar dependendo de ambos os pacotes, o desenvolvedor poderá encontrar conflitos de nome de tipo. No que diz respeito ao .NET, há diferentes tipos em diferentes assemblies.