Pourquoi utiliser des assemblys nommés forts?

107

Quels sont les avantages de l'utilisation d'assemblys nommés forts?

Quelles sont les choses qui ne peuvent pas être faites avec un assemblage normal?

développeur
la source

Réponses:

92

Permettez-moi d'énumérer d'abord les avantages d'un nom fort de votre assemblage:

  1. Le nom fort de votre assembly vous permet d'inclure votre assembly dans le Global Assembly Cache (GAC). Ainsi, il vous permet de le partager entre plusieurs applications.

  2. Une dénomination forte garantit un nom unique pour cet assemblage. Personne d'autre ne peut donc utiliser le même nom d'assembly.

  3. Le nom fort protège la lignée de version d'un assembly. Un nom fort peut garantir que personne ne pourra produire une version ultérieure de votre assembly. Les utilisateurs de l'application sont assurés qu'une version de l'assembly qu'ils chargent proviennent du même éditeur qui a créé la version avec laquelle l'application a été créée.

Pour en savoir plus sur la dénomination forte de Microsoft, consultez les assemblys à nom fort ( MSDN ).

Kyle Rosendo
la source
1
Êtes-vous sûr du point 4? Je pense que ce comportement a peut-être changé récemment. J'ai essayé de faire échouer le chargement d'un assemblage fortement nommé en le modifiant, mais il s'est chargé sans incident.
Jens
19
En ce qui concerne le n ° 4, c'est incorrect. Il n'est pas conçu pour protéger contre la falsification. Voir blogs.msdn.com/b/shawnfa/archive/2005/12/13/… pour en savoir plus.
Colin Bowern
1
@ RobV8R 90% de nos dépendances sont open source, les clés privées sont dans les dépôts publics git (selon les recommandations de Microsoft) et disponibles pour tous ceux qui les souhaitent.
trampster
1
@ RobV8R Vous ne pouvez pas utiliser le mot compromis ici, cela impliquerait qu'il est destiné à être un secret en premier lieu. Les directives de Microsoft sont que la clé privée doit être conservée dans votre référentiel source public. Les clés privées ne sont pas compromises, elles sont publiées intentionnellement. Étant donné que les clés privées sont connues et destinées à être utilisées par des personnes modifiant le code open source des projets parents (sinon la licence serait violée dans de nombreux cas), les personnes faisant cela utiliseraient un numéro de version différent mais la même clé, dans ce cas au cas où une redirection obligatoire serait requise.
trampster
1
@ RobV8R Ce que je voulais dire à l'origine, c'est que beaucoup de gens pensent qu'une forte dénomination garantit que votre dépendance est verrouillée sur une version spécifique d'un assembly, et ce n'est tout simplement pas le cas, une simple redirection de liaison peut changer la version que vous utilisez à condition qu'elle a été signé avec la même clé privée. Et comme je l'ai dit, les clés privées sont intentionnellement publiées pour la plupart de nos dépendances.
trampster
9

Quelles sont les choses qui ne peuvent pas être faites avec un assemblage normal?

Étant donné que toutes les discussions qui ont commencé avec la montée en puissance de Nuget ont suggéré de se débarrasser complètement des assemblages nommés forts, mon entreprise a essayé cela et a rencontré un changement de comportement important en ce qui concerne les paramètres d'application:

Si vous utilisez l'application automatique ou les paramètres d'application à portée utilisateur fournis par VisualStudio (héritant de System.Configuration.ApplicationSettingsBase), un EXE nommé fort créera exactement 1 répertoire dans% LOCALAPPDATA% nommé par exemple "YourApplication.exe_StrongName_kjsdfzsuzdfiuzgpois EXEdiufzsdouif", peu importe où se trouve le fichier. situé.

Mais sans le nom fort, l'emplacement (= chemin) de l'EXE sera utilisé pour créer une valeur de hachage qui diffère déjà entre DEBUG et RELEASE build, créant de nombreux répertoires à l'intérieur de% LOCALAPPDATA% nommés comme "YourApplication.exe_Url_dfg8778d6fs7g6d7f8g69sdf". Cela le rend inutilisable pour les déploiements ClickOnce où le répertoire d'installation change à chaque mise à jour.

élastique76
la source
5

Je voudrais ajouter que sans un nom fort, vous ne pouvez pas utiliser de redirections de liaison dans les fichiers de configuration.

Cela ne fonctionnera pas:

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

Vous devez avoir un jeton de clé publique

  <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
la source
9
Les redirections de liaison ne sont pas nécessaires si vous n'avez pas de nom fort.
trampster
0

Juste un exemple: je voudrais donner une réponse en mettant davantage l'accent sur la sécurité . Dans le cas où nous créons des assemblys avec un code source que nous ne souhaitons pas réutiliser pour un tiers mais que nous voulons qu'il soit testable, nous pouvons fortement signer un assembly et rendre les composants internes visibles uniquement pour ces assemblys avec le même signature.

Ricky Youssef
la source