Nomenclatura forte
Nomenclatura forte refere-se à assinatura de 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 nome e no número da versão do assembly, e pode ajudar a evitar conflitos de assembly.
A desvantagem da nomenclatura forte é que o .NET Framework no Windows permite o carregamento estrito de assemblies quando um assembly é nomeado 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 vinculaçã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 de nomenclatura forte, o que eles geralmente estão reclamando é o carregamento rigoroso do assembly. Felizmente, esse problema é isolado no .NET Framework. .NET 5+, .NET Core, Xamarin, UWP e a maioria das outras implementações .NET não têm carregamento de assembly estrito, que é a principal desvantagem da nomenclatura forte.
Um aspeto importante da nomenclatura forte no .NET Framework é que ela é viral: um assembly de nome forte só pode fazer referência a outros assemblies de nome forte. Se sua biblioteca não tiver um nome forte, os aplicativos e 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:
- O assembly pode ser referenciado e usado por outros assemblies de nome forte.
- O assembly pode ser armazenado no GAC (Global Assembly Cache).
- O conjunto pode ser carregado lado a lado com outras versões do conjunto. O carregamento de montagem lado a lado é normalmente exigido por aplicações 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 nomeados fortes que fazem referência a assemblies nomeados não fortes. Não há problema em suprimir esse aviso para bibliotecas destinadas somente ao .NET Core/5+.
Crie bibliotecas .NET nomeadas fortes
Você deve nomear fortemente suas bibliotecas .NET de código aberto se seus destinos incluírem .NET Framework ou .NET Standard. A nomenclatura forte não é necessária para bibliotecas destinadas somente ao .NET Core/5+.
Nota
Esta orientação é específica para bibliotecas .NET distribuídas publicamente, como bibliotecas .NET publicadas no NuGet.org. A nomenclatura forte não é exigida pela maioria dos aplicativos .NET e não deve ser feita por padrão.
✔️ CONSIDERE nomear fortemente os assemblies da sua biblioteca.
✔️ CONSIDERE adicionar a chave de nomenclatura forte ao seu sistema de controle do código-fonte.
Uma chave disponível publicamente permite que os desenvolvedores modifiquem e recompilem o código-fonte da biblioteca com a mesma chave.
Você não deve tornar pública a chave de nomenclatura forte se ela tiver sido usada no passado para conceder permissões especiais em cenários de confiança parcial. Caso contrário, você pode comprometer os ambientes existentes.
Importante
Quando a identidade do editor do código é desejada, o Authenticode e a Assinatura de Pacote NuGet são recomendados. A Segurança de Acesso ao Código (CAS) não deve ser usada como uma atenuação de segurança.
✔️ CONSIDERE incrementar a versão do assembly apenas em alterações de versão principais para ajudar os usuários a reduzir os redirecionamentos de vinculação e a frequência com que eles são atualizados.
Leia mais sobre versionamento e a versão assembly.
❌ NÃO adicione, remova ou altere a chave de nomenclatura forte.
Modificar a chave de nomenclatura forte de um assembly altera a identidade do assembly e quebra o código compilado que o usa. Para obter mais informações, consulte Alterações de quebra binária.
❌ NÃO publique versões com e sem nomes fortes da sua biblioteca. Por exemplo, Contoso.Api
e Contoso.Api.StrongNamed
.
A publicação de dois pacotes bifurca o ecossistema do desenvolvedor. Além disso, se um aplicativo acabar dependendo de ambos os pacotes, o desenvolvedor pode encontrar conflitos de nome de tipo. No que diz respeito ao .NET, eles são tipos diferentes em assemblies diferentes.