149 votes

Redirection de la fixation de l'assemblage : comment et pourquoi ?

Il ne s'agit pas d'un problème mais d'une question de compréhension générale sur le fonctionnement de la redirection de la liaison par assemblage.

Requêtes

  1. Pourquoi la redirection de liaison ne montre que la version majeure et non la mineure, les numéros de construction et de révision ?
  2. L'ancienne et la nouvelle version ne changent-elles que lorsqu'il y a un changement de version majeure ?

    <dependentAssembly>
        <assemblyIdentity name="FooBar"  
                          publicKeyToken="32ab4ba45e0a69a1"  
                          culture="en-us" />  
    
        <bindingRedirect oldVersion="7.0.0.0" newVersion="8.0.0.0" />  
    </dependentAssembly>

0 votes

Il peut s'agir de n'importe quelle version, pas seulement de la principale. Par exemple : oldVersion="0.0.0.0-4.1.0.0" newVersion="4.1.0.0"

0 votes

@Evk : Tous les exemples que j'ai vus montrent uniquement la version majeure.

5 votes

Ce ne sont que des exemples, et il n'est dit nulle part que c'est la seule façon possible.

194voto

Evk Points 17804

Pourquoi les redirections de liaison sont-elles nécessaires ? Supposons que vous ayez une application A qui fait référence à la bibliothèque B et à la bibliothèque C de la version 1.1.2.5. La bibliothèque B fait à son tour référence à la bibliothèque C, mais à la version 1.1.1.0. Nous avons maintenant un conflit, car vous ne pouvez pas charger différentes versions du même assemblage au moment de l'exécution. Pour résoudre ce conflit, vous pouvez utiliser une redirection de liaison, généralement vers la nouvelle version (mais aussi vers l'ancienne). Pour ce faire, ajoutez la ligne suivante au fichier app.config de l'application A, sous la rubrique configuration > runtime > assemblyBinding (voir aquí pour un exemple de fichier de configuration complet) :

<dependentAssembly>
    <assemblyIdentity name="C"  
                      publicKeyToken="32ab4ba45e0a69a1"  
                      culture="en-us" />  

    <bindingRedirect oldVersion="1.1.1.0" newVersion="1.1.2.5" />  
</dependentAssembly>

Vous pouvez également spécifier une gamme de versions à mettre en correspondance :

<bindingRedirect oldVersion="0.0.0.0-1.1.1.0" newVersion="1.1.2.5" />  

Maintenant, la bibliothèque B, qui a été compilée en faisant référence à C de la version 1.1.1.0, utilisera C de la version 1.1.2.5 au moment de l'exécution. Bien entendu, il est préférable de s'assurer que la bibliothèque C est rétrocompatible ou cela pourrait conduire à des résultats inattendus.

Vous pouvez rediriger toutes les versions des bibliothèques, pas seulement les principales.

0 votes

Dans quel dossier et sous quelle section doivent-ils être placés ? Quelqu'un peut-il fournir un lien vers une source comme MSDN ou autre pour référence ? N'oubliez pas que les internautes atterriront sur vos articles de questions-réponses en provenance de toute la sphère des moteurs de recherche et que les références sont essentielles. Un collègue m'a dit "ajoutez simplement une redirection d'assemblage à votre fichier exe" juste avant de partir en vacances pour une semaine et j'ai atterri ici et bien que cette réponse semble excellente, elle manque de contexte et de référence.

0 votes

Questions valables @tpartee, j'ai édité la réponse (en attente d'un examen par les pairs) pour inclure la section configuration et un lien vers docs.microsoft.com/fr-us/dotnet/framework/configure-apps/

0 votes

App.config ou web.config : ` <configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="C" publicKeyToken="32ab4ba45e0a69a1" culture="en-us" /> <bindingRedirect oldVersion="1. 1.1.0" newVersion="1.1.2.5" /> </dependentAssembly> </assemblyBinding> </runtime> </configuration> ``.

88voto

amyth91 Points 320

Nous avons rencontré un problème de redirection de liaison pour NewtonSoft.Json. Nous avons cherché la version du fichier dans les propriétés du fichier de Win 10 "9.0.1.19813", nous avons cherché le numéro et la redirection a continué à échouer. Une enquête plus approfondie a révélé que nous regardions la version du fichier et non la version de l'assemblage. Je me demande donc si les gens ne confondent pas la version du fichier (qui change souvent) et la version de l'assemblage (que vous ne pouvez pas voir dans l'explorateur de fichiers de Windows 10). Pour voir la version d'assemblage d'une dll, vous pouvez exécuter ceci dans powershell. Remplacez le nom de la dll par celle dont vous voulez trouver la version.

[Reflection.AssemblyName]::GetAssemblyName('C:\development\bin\Newtonsoft.Json.dll').Version

Le résultat de ce qui précède est.

Major  Minor  Build  Revision

-----  -----  -----  --------

9      0      0      0

Voir les références :

Comment puis-je voir la version d'une assembly .NET dans Windows Vista et plus récent (Windows 7, 2008) ?

https://support.microsoft.com/en-nz/help/556041

enter image description here

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X