Starke Namen
Starke Namen bezieht sich auf das Signieren einer Assembly mit einem Schlüssel, wodurch eine Assembly mit starkem Namen entsteht. Wenn eine Assembly einen starken Namen hat, erzeugt sie eine eindeutige Identität basierend auf dem Namen und der Versionsnummer der Assembly, und dies kann helfen, Konflikte in der Assembly zu vermeiden.
Der Nachteil eines starken Namens ist, dass das .NET Framework unter Windows ein striktes Laden von Assemblys ermöglicht, sobald eine Assembly einen starken Namen aufweist. Eine Referenz auf eine Assembly mit starkem Namen muss genau der Version der geladenen Assembly entsprechen. Dadurch sind Entwickler gezwungen, Bindungsumleitungen zu konfigurieren, wenn sie die Assembly verwenden:
<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>
Wenn sich .NET-Entwickler über starke Namen beschweren, geht es in der Regel um das strikte Laden einer Assembly. Glücklicherweise besteht dieses Problem nur im .NET Framework. .NET 5 und höher, .NET Core, Xamarin, UWP und die meisten anderen .NET-Implementierungen sind vom strikten Laden von Assemblys und somit dem größten Nachteil starker Namen nicht betroffen.
Ein wichtiger Aspekt eines starken Namens im .NET Framework ist, dass sie viral ist: eine Assembly mit einem starken Namen kann nur auf andere Assemblys mit einem starken Namen verweisen. Wenn Ihre Bibliothek nicht stark benannt ist, können .NET Framework-Apps und -Bibliotheken, die eine starke Benennung benötigen, diese nicht verwenden.
Die Vorteile einer starken Benennung in .NET Framework sind:
- Die Assembly kann nur von anderen Assemblys mit starkem Namen referenziert und verwendet werden.
- Die Assembly kann im globalen Assemblycache (GAC) gespeichert werden.
- Die Assembly kann parallel mit anderen Versionen der Assembly geladen werden. Das parallele Laden von Assemblys ist häufig für Anwendungen mit Plug-in-Architekturen erforderlich.
Starke Benennung hat keine Vorteile für .NET Core/5+. C#-Compiler erzeugt CS8002-Warnung für stark benannte Assemblys, die auf nicht starke benannte Assemblys verweisen. Es ist in Ordnung, diese Warnung für Bibliotheken zu unterdrücken, die nur auf .NET Core/5+ abzielen.
Erstellen von .NET-Bibliotheken mit starkem Namen
Sie sollten unbedingt eine starke Benennung für ihre Open-Source .NET-Bibliotheken verwenden, wenn ihre Ziele .NET Framework oder .NET Standard enthalten. Eine starke Benennung ist nicht für Bibliotheken erforderlich, die nur .NET Core/5+ verwenden.
Hinweis
Diese Anleitung bezieht sich auf öffentlich verteilte .NET-Bibliotheken, wie z.B. auf NuGet.org veröffentlichte .NET-Bibliotheken. Ein starker Namen ist für die meisten .NET-Anwendungen nicht erforderlich und sollte nicht standardmäßig vorgenommen werden.
✔️ Erwägen Sie, Ihren Bibliotheksassemblys einen starken Namen zu geben.
✔️ Erwägen Sie, den Schlüssel für die eindeutige Benennung zu Ihrem Quellcodeverwaltungssystem hinzuzufügen.
Ein öffentlich verfügbarer Schlüssel ermöglicht es Entwicklern, den Quellcode Ihrer Bibliothek mit demselben Schlüssel zu ändern und neu zu kompilieren.
Sie sollten den starken Namensschlüssel nicht öffentlich machen, wenn er in der Vergangenheit zur Vergabe von Sonderrechten in teilweise vertrauenswürdigen Szenarien verwendet wurde. Andernfalls können Sie vorhandene Umgebungen beeinträchtigen.
Wichtig
Wenn die Identität des Herausgebers des Codes erwünscht ist, werden Authenticode und NuGet-Paketsignierung empfohlen. Die Codezugriffssicherheit (Code Access Security, CAS) sollte nicht zur Risikominderung verwendet werden.
✔️ Erwägen Sie, die Assemblyversion nur bei größeren Versionsänderungen zu erhöhen, um Benutzern zu helfen, Bindungsumleitungen und die Häufigkeit ihrer Aktualisierung zu reduzieren.
Erfahren Sie mehr über die Versionsverwaltung und die Assemblyversion.
❌ Den Schlüssel für die eindeutige Benennung weder hinzufügen, noch ändern oder entfernen
Das Ändern des starken Namensschlüssels einer Assembly ändert die Identität der Assembly und zerlegt kompilierten Code, der ihn verwendet. Weitere Informationen finden Sie unter Binäre Breaking Changes.
❌ Veröffentlichen Sie NICHT die Versionen Ihrer Bibliothek mit oder ohne starkem Namen. Beispiel: Contoso.Api
und Contoso.Api.StrongNamed
.
Die Veröffentlichung von zwei Paketen verzweigt Ihr Entwicklerökosystem. Auch wenn eine Anwendung letztendlich von beiden Paketen abhängig ist, kann es bei dem Entwickler zu Typnamenskonflikten kommen. Was .NET betrifft, so sind sie verschiedene Typen in verschiedenen Assemblys.