web-dev-qa-db-fra.com

Assemblage, redirection: comment et pourquoi?

Ce n'est pas une question de problème mais une question de compréhension générale sur le fonctionnement de la redirection de liaison contraignante.

Requêtes

  1. Pourquoi la redirection par liaison affiche uniquement les versions majeures et non mineures, les numéros de build et de révision?
  2. L'ancienne et la nouvelle version ne changent-elles que lorsqu'il y a un changement dans la version principale?

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

Pourquoi les redirections de liaison sont-elles nécessaires? Supposons que vous ayez une application A qui référence la bibliothèque B, ainsi que la bibliothèque C de la version 1.1.2.5. La bibliothèque B, à son tour, fait également référence à la bibliothèque C, mais de 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 vous pouvez également utiliser l'ancienne). Vous faites cela en ajoutant ce qui suit au fichier app.config de l’application A, sous la section configuration > runtime > assemblyBinding (voir ici 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 à mapper:

<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 avec la 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 sûr, vous devez vous assurer que la bibliothèque C est compatible avec les versions antérieures, car cela pourrait conduire à des résultats inattendus.

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

104
Evk

Nous avons rencontré un problème avec la redirection de liaison pour NewtonSoft.Json. Nous avons recherché la version du fichier dans les propriétés de fichier Win 10 "9.0.1.19813", recherché le numéro et la redirection maintenue en échec. Une enquête plus poussée a révélé que nous examinions la version du fichier et non la version de l’Assemblée. Je me demande donc si les gens se trompent de version de fichier (qui change souvent) et de version d'assemblage (que vous ne pouvez pas voir dans l'explorateur de fichiers Windows 10). Pour voir la version Assembly d'une DLL, vous pouvez l'exécuter dans Powershell. Remplacez le nom de la DLL par celui pour lequel vous souhaitez trouver la version.

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

Le résultat ci-dessus est.

Major  Minor  Build  Revision

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

9      0      0      0

Voir références:

Comment puis-je voir la version d'assemblage d'un assemblage .NET dans Windows Vista et les versions plus récentes (Windows 7, 2008)?

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

enter image description here

22
amyth91