web-dev-qa-db-fra.com

La redirection de liaison d'assemblage ne fonctionne pas

J'essaie de configurer une redirection de liaison d'assembly à l'aide du fichier app.config suivant:

<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-Microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.AnalysisServices"
                          PublicKeyToken="89845dcd8080cc91" />
        <bindingRedirect oldVersion="10.0.0.0"
                         newVersion="9.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

J'exécute le programme sur une machine avec la version 9.0.242.0 du GAC, avec le jeton de clé publique spécifié. Le CLR ne semble même pas essayer de rediriger la liaison pour utiliser cette version.

Voici ce que je trouve dans fuslogvw.exe:

LOG: This bind starts in default load context. LOG: Using application configuration file: \Debug\AssemblyRedirectPOC.exe.Config LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\v2.0.50727\config\machine.config. LOG: Post-policy reference: Microsoft.AnalysisServices, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91 LOG: GAC Lookup was unsuccessful. LOG: Attempting download of new URL /Debug/Microsoft.AnalysisServices.DLL. LOG: Attempting download of new URL /Debug/Microsoft.AnalysisServices/Microsoft.AnalysisServices.DLL. LOG: Attempting download of new URL /Debug/Microsoft.AnalysisServices.EXE. LOG: Attempting download of new URL /Debug/Microsoft.AnalysisServices/Microsoft.AnalysisServices.EXE. LOG: All probing URLs attempted and failed.

Quand j'ai essayé de mettre la version 9.0.242.0 dll dans le chemin de la sonde, je reçois plutôt ceci:

LOG: Assembly download was successful. Attempting setup of file: \Debug\Microsoft.AnalysisServices.dll LOG: Entering run-from-source setup phase. LOG: Assembly Name is: Microsoft.AnalysisServices, Version=9.0.242.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91 WRN: Comparing the Assembly name resulted in the mismatch: Major Version ERR: The Assembly reference did not match the Assembly definition found. ERR: Failed to complete setup of Assembly (hr = 0x80131040). Probing terminated.

Notez que j'ai également essayé de changer la redirection pour utiliser "9.0.242.0" au lieu de "9.0.0.0" dans app.config et cela n'a pas fonctionné, bien que je ne pense pas que cela devrait faire une différence.

De ce que je comprends, l’intérêt de rediriger une liaison est d’utiliser une version qui ne correspond pas à celle avec laquelle le programme a été construit. Est-ce que je manque complètement quelque chose ici? Est-ce que ce que j'essaie de faire est possible et, le cas échéant, pourquoi ne fonctionne-t-il pas?

À la vôtre, Adam

26
Adam

Toute faute de frappe dans la configuration XML peut être une cause. Loader ne peut tout simplement pas voir votre configuration . J'ai également eu une heure de migraine jusqu'à ce que je réalise que l'erreur était dans le caractère "=" au lieu de "-" dans le nom du schéma:

<assemblyBinding xmlns="urn:schemas=Microsoft-com:asm.v1">

Il suffit de vérifier soigneusement tous les noms et valeurs d'attributs. Je suppose que "PublicKeyToken" devrait être "publicKeyToken"

Cela devrait fonctionner:

<configuration>
<runtime>
    <assemblyBinding xmlns="urn:schemas-Microsoft-com:asm.v1">
        <dependentAssembly>
            <assemblyIdentity name="Microsoft.AnalysisServices" publicKeyToken="89845dcd8080cc91" />
            <bindingRedirect oldVersion="10.0.0.0" newVersion="9.0.0.0"/>
        </dependentAssembly>
    </assemblyBinding>
</runtime>
</configuration>
23
Shrike

Assurez-vous que votre balise <configuration> possède l'attribut no namespace. Sinon, toute balise <assemblyBinding> sera ignorée.

Faux:

<configuration xmlns="http://schemas.Microsoft.com/.NetConfiguration/v2.0">

Droite:

<configuration>

(from https://stackoverflow.com/a/12011221/150370 )

12
German Latorre

J'ai rencontré liaison redirect do en raison d'un espace de noms manquant sur l'élément assemblyBinding.

Correct

<assemblyBinding xmlns="urn:schemas-Microsoft-com:asm.v1">
  <dependentAssembly>
    <assemblyIdentity name="TIBCO.Rendezvous" publicKeyToken="1a696d1f90f6158a"/>
    <bindingRedirect oldVersion="1.0.0.0-1.0.3191.28836" newVersion="1.0.3191.28836"/>
  </dependentAssembly>

Incorrect

Remarque manquant: xmlns = "urn: schemas-Microsoft-com: asm.v1"

<assemblyBinding>
  <dependentAssembly>
    <assemblyIdentity name="TIBCO.Rendezvous" publicKeyToken="1a696d1f90f6158a"/>
    <bindingRedirect oldVersion="1.0.0.0-1.0.3191.28836" newVersion="1.0.3191.28836"/>
  </dependentAssembly>

10
Edward Wilde

dans mon cas, je devais enlever le 

appliesTo="v2.0.05727" 

de

<assemblyBinding appliesTo="v2.0.05727" xmlns="urn:schemas-Microsoft-com:asm.v1">
4
sawe

J'ai eu un problème similaire où le déplacement de bindingredirects vers Machine.Config était la seule chose qui fonctionnait. Ce n'était pas la solution idéale dans mon application winform, car je distribue mon application aux clients.

Solution:

Assurez-vous que le fichier .config se trouve dans le répertoire où votre application est exécutée. par exemple. Si votre AppName est "MyApp", les redirections doivent figurer dans le fichier "MyApp.exe.Config" du répertoire de l'application. 

Je devais le faire même si le code qui utilise des dll tierces se trouve dans différentes dll de ma solution et que l'ajout de .dll.config n'a pas aidé. 

3
Patel

Mon problème a été résolu lorsque j'ai déplacé la configuration de redirection de liaison dans le fichier machine.config.

3
F34R

Les politiques de mot de passe excentriques peuvent également entraîner l'ignorance des éléments assemblyBinding de la configuration. Des caractères tels que '&' et '^' ne sont apparemment pas autorisés dans un fichier de configuration. Les outils XML de Notepad ++ me l'ont révélé après quelques heures de manipulation de la visionneuse de journal d'assemblage.

1
jscheppers

Si cela peut aider quelqu'un, je me suis heurté à cela parce que je n'avais pas mis la version complète dans newVersion. c'est-à-dire que j'avais newVersion="3.0.1" au lieu de newVersion="3.0.1.0"

0
JohnnyFun

Si vous installez Visual Studio 2017 sans la partie outils de développement ASP.NET, il continuera à charger un projet Web, à le compiler et à le construire. Il ne fera que donner des avertissements sur les versions du paquet NuGet, car il ne sait pas quoi faire avec le fichier web.config et ne peut donc pas voir les redirections de liaison. 

Réparer l’installation a résolu mon problème, mais il a fallu une éternité pour le résoudre.

0
Bakanekobrain

Merci beaucoup pour les réponses, en particulier celle de Shrike. J'avais une application qui fonctionnait en développement, mais pas dans la version déployée. Quand j'ai regardé de plus près, j'avais ceci en production, ce qui ne correspondait pas au développement:

  <runtime>
    <assemblyBinding xmlns="urn:schemas-Microsoft-com:asm.v1">
      <dependentAssembly xmlns="">
        <assemblyIdentity name="Newtonsoft.Json" culture="neutral" publicKeyToken="30ad4fe6b2a6aeed" />
        <bindingRedirect oldVersion="0.0.0.0-10.0.0.0" newVersion="10.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>

dependAssembly xmlns = "" était le coupable. Dès que j'ai comparé la mienne à votre réponse et corrigé le problème, cela fonctionnait. Merci pour l'aide

0
Wayne

Vérifiez si l'erreur La redirection de liaison explicite sur xxx, Culture = neutre, PublicKeyToken = xxx "est en conflit avec une redirection de liaison générée automatiquement

apparaît dans la fenêtre de sortie (il n'apparaîtra pas dans la fenêtre d'erreur)

0
Markus