Warum stark benannte Assemblys verwenden?

107

Was sind die Vorteile der Verwendung von Baugruppen mit starken Namen?

Was kann man mit einer normalen Baugruppe nicht machen?

Entwickler
quelle

Antworten:

92

Lassen Sie mich zunächst die Vorteile einer starken Benennung Ihrer Baugruppe auflisten:

  1. Durch die starke Benennung Ihrer Assembly können Sie Ihre Assembly in den Global Assembly Cache (GAC) aufnehmen. Auf diese Weise können Sie es für mehrere Anwendungen freigeben.

  2. Eine starke Benennung garantiert einen eindeutigen Namen für diese Baugruppe. Somit kann niemand sonst den gleichen Baugruppennamen verwenden.

  3. Starker Name schützt die Versionslinie einer Baugruppe. Ein starker Name kann sicherstellen, dass niemand eine nachfolgende Version Ihrer Baugruppe erstellen kann. Anwendungsbenutzer stellen sicher, dass eine Version der Assembly, die sie laden, von demselben Herausgeber stammt, der die Version erstellt hat, mit der die Anwendung erstellt wurde.

Weitere Informationen zu starken Namen von Microsoft finden Sie in MSDN ( Strong-Named Assemblies ).

Kyle Rosendo
quelle
1
Sind Sie sicher bei Punkt 4? Ich denke, vielleicht hat sich dieses Verhalten in letzter Zeit geändert. Ich habe versucht, das Laden einer Assembly mit starkem Namen durch Ändern fehlzuschlagen, aber sie wurde ohne Zwischenfälle geladen.
Jens
19
In Bezug auf # 4 ist das falsch. Es ist nicht zum Schutz vor Manipulationen ausgelegt. Weitere Informationen finden Sie unter blogs.msdn.com/b/shawnfa/archive/2005/12/13/… .
Colin Bowern
1
@ RobV8R 90% unserer Abhängigkeiten sind Open Source, die privaten Schlüssel befinden sich in den öffentlichen Git-Repos (gemäß Microsoft-Empfehlungen) und stehen jedem zur Verfügung, der sie möchte.
Trampster
1
@ RobV8R Du kannst das hier kompromittierte Wort nicht verwenden, das würde bedeuten, dass es in erster Linie ein Geheimnis sein soll. Microsoft-Richtlinien besagen, dass der private Schlüssel in Ihrem öffentlichen Quell-Repository aufbewahrt werden soll. Die privaten Schlüssel werden nicht gefährdet, sie werden absichtlich veröffentlicht. Da die privaten Schlüssel bekannt sind und von Personen verwendet werden sollen, die den OpenSource-Code übergeordneter Projekte ändern (andernfalls würde die Lizenz in vielen Fällen verletzt), würden Personen, die dies tun, eine andere Versionsnummer verwenden, jedoch denselben Schlüssel In diesem Fall wäre eine verbindliche Weiterleitung erforderlich.
Trampster
1
@ RobV8R Was ich ursprünglich wollte, ist, dass viele Leute glauben, dass eine starke Benennung garantiert, dass Ihre Abhängigkeit an eine bestimmte Version einer Assembly gebunden ist, und das ist einfach nicht der Fall. Eine einfache Bindungsumleitung kann die von Ihnen verwendete Version ändern, vorausgesetzt, sie wurde mit demselben privaten Schlüssel signiert. Und wie gesagt, die privaten Schlüssel werden für die meisten unserer Abhängigkeiten absichtlich veröffentlicht.
Trampster
9

Was kann man mit einer normalen Baugruppe nicht machen?

Da alle Diskussionen, die mit dem Aufstieg von Nuget begannen, darauf hinwiesen, stark benannte Assemblys vollständig loszuwerden, versuchte mein Unternehmen dies und stieß auf eine signifikante Verhaltensänderung bei den Anwendungseinstellungen:

Wenn Sie die von VisualStudio bereitgestellten Einstellungen für automatische Apps oder Anwendungen mit Benutzerbereich verwenden (System.Configuration.ApplicationSettingsBase erben), erstellt eine stark benannte EXE-Datei genau 1 Verzeichnis in% LOCALAPPDATA% mit dem Namen "YourApplication.exe_StrongName_kjsdfzsuzdfiuzgpoisdiufzsd" gelegen.

Ohne den starken Namen wird der Speicherort (= Pfad) der EXE-Datei verwendet, um einen Hash-Wert zu erstellen, der sich bereits zwischen DEBUG- und RELEASE-Build unterscheidet. Dabei werden viele Verzeichnisse in% LOCALAPPDATA% mit dem Namen "YourApplication.exe_Url_dfg8778d6fs7g6d7f8g69sdf" erstellt. Dies macht es für ClickOnce-Bereitstellungen unbrauchbar, bei denen sich das Installationsverzeichnis mit jedem Update ändert.

springy76
quelle
5

Ich möchte hinzufügen, dass Sie ohne einen starken Namen keine Bindungsumleitungen in Konfigurationsdateien verwenden können.

Dies wird nicht funktionieren:

  <dependentAssembly>
    <assemblyIdentity name="MyAssembly.MyComponent" publicKeyToken="null" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
  </dependentAssembly>

Sie benötigen ein öffentliches Schlüssel-Token

  <dependentAssembly>
    <assemblyIdentity name="MyAssembly.MyComponent" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
  </dependentAssembly>
tomasat
quelle
9
Bindungsumleitungen sind nicht erforderlich, wenn Sie keinen starken Namen haben.
Trampster
0

Nur ein Beispiel: Ich möchte eine Antwort geben, die mehr Wert auf Sicherheit legt . Wenn wir Assemblys mit einem Quellcode erstellen, den wir nicht für Dritte wiederverwenden möchten, der aber testbar sein soll, können wir eine Assembly stark signieren und die Interna nur für die Assemblys mit dem sichtbar machen gleiche Unterschrift.

Ricky Youssef
quelle