Sdílet prostřednictvím


Vytváření silných názvů

Silné pojmenování odkazuje na podepsání sestavení pomocí klíče, což vytváří sestavení se silným názvem. Když je sestavení se silným názvem, vytvoří jedinečnou identitu založenou na názvu a čísle verze sestavení a může pomoct zabránit konfliktům sestavení.

Nevýhodou silného pojmenování je, že rozhraní .NET Framework ve Windows umožňuje striktní načítání sestavení, jakmile je sestavení silné pojmenované. Odkaz na sestavení se silným názvem musí přesně odpovídat verzi načteného sestavení, aby vývojáři při použití sestavení nakonfigurovali přesměrování vazeb:

<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>

Když si vývojáři .NET stěžují na silné pojmenování, obvykle si stěžují na striktní načítání sestavení. Naštěstí je tento problém izolovaný na rozhraní .NET Framework. .NET 5+, .NET Core, Xamarin, UPW a většina ostatních implementací .NET nemá přísné načítání sestavení, což je hlavní nevýhodou silného pojmenování.

Jedním z důležitých aspektů silného pojmenování v rozhraní .NET Framework je to, že je virální: sestavení se silným názvem může odkazovat pouze na jiná sestavení se silným názvem. Pokud vaše knihovna není silná, aplikace a knihovny rozhraní .NET Framework, které potřebují silné pojmenování, ho nemůžou používat.

Výhody silného pojmenování v rozhraní .NET Framework jsou:

  1. Na sestavení lze odkazovat a používat další sestavení se silným názvem.
  2. Sestavení lze uložit do globální mezipaměti sestavení (GAC).
  3. Sestavení lze načíst souběžně s jinými verzemi sestavení. Souběžné načítání sestavení je běžně vyžadováno aplikacemi s architekturami modulů plug-in.

Silné pojmenování nemá žádné výhody pro .NET Core/5+. Kompilátor jazyka C# vytvoří upozornění CS8002 pro sestavení se silným názvem odkazující na sestavení, která nejsou silná. U knihoven, které cílí jenom na .NET Core/5 nebo novější, je dobré toto upozornění potlačit.

Vytvoření silných pojmenovaných knihoven .NET

Pokud jejich cíle zahrnují .NET Framework nebo .NET Standard, měli byste své opensourcové knihovny .NET pojmenovat. Pro knihovny, které cílí jenom na .NET Core/5 nebo novější, se nevyžaduje silné pojmenování.

Poznámka:

Tyto pokyny jsou specifické pro veřejně distribuované knihovny .NET, jako jsou knihovny .NET publikované na NuGet.org. Většina aplikací .NET nevyžaduje silné pojmenování a nemělo by se ve výchozím nastavení provádět.

✔️ ZVAŽTE silné pojmenování sestavení knihovny.

✔️ ZVAŽTE přidání silného klíče pro pojmenování do systému správy zdrojového kódu.

Veřejně dostupný klíč umožňuje vývojářům upravovat a překompilovat zdrojový kód knihovny se stejným klíčem.

Pokud jste ho v minulosti použili k udělení zvláštních oprávnění ve scénářích částečné důvěryhodnosti, neměli byste ho nastavit jako veřejný. V opačném případě můžete ohrozit stávající prostředí.

Důležité

Pokud je požadovaná identita vydavatele kódu, doporučuje se podepisování balíčků Authenticode a NuGet. Zabezpečení přístupu kódu (CAS) by se nemělo používat jako omezení zabezpečení.

✔️ ZVAŽTE zvýšení verze sestavení pouze u změn hlavních verzí, které uživatelům pomůžou omezit přesměrování vazeb a jak často se aktualizují.

Přečtěte si další informace o správě verzí a verzi sestavení.

❌ NEPŘIDÁVEJTE, odebírat ani měnit silný klíč pro pojmenování.

Úprava silného klíče pojmenování sestavení změní identitu sestavení a přeruší zkompilovaný kód, který ho používá. Další informace najdete v tématu binární zásadní změny.

❌ NEpublikujte verze knihovny se silnými názvy a verzemi, které nejsou silné. Příklad: Contoso.Api a Contoso.Api.StrongNamed.

Publikováním dvou balíčků se vytvoří fork vašeho vývojového ekologického systému. Pokud aplikace skončí v závislosti na obou balíčcích, může vývojář narazit na konflikty názvů typů. Pokud jde o .NET, jedná se o různé typy v různých sestaveních.