Je viens de copier un projet existant sur une toute nouvelle machine pour commencer à développer dessus et j'ai rencontré un problème avec la version de l'un de mes assemblys référencés (une DLL telerik en l'occurrence).
Le projet faisait à l'origine référence à une version plus ancienne de l'assembly (appelons-la v1.0.0.0). Ma nouvelle machine a la dernière version de l'assemblage installée, donc j'ai pensé l'avoir mise à jour (appelons la nouvelle version v2.0.0.0).
Voici maintenant le problème: si je copie l'ancienne dll v1.0.0.0 dans le dossier du projet et que je l'ajoute comme référence, le site Web se lance sans problème. Si je supprime cette référence (et supprime également l'ancienne DLL de mon système) et ajoute la nouvelle version (v2.0.0.0), la page affiche l'exception suivante:
Impossible de charger le fichier ou l'assembly 'XXXXXX, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = 121fae78165ba3d4' ou l'une de ses dépendances. La définition de manifeste de l'assembly localisé ne correspond pas à la référence d'assembly. (Exception de HRESULT: 0x80131040)
De toute évidence, le code recherche la version obsolète et ne peut pas la trouver. Mais pourquoi?
J'ai grepé le dossier de solution pour ce numéro de version et je n'ai pas trouvé une seule référence. J'ai vérifié deux fois le texte du fichier .csproj et j'ai trouvé que la version affiche correctement la dernière version et le HintPath montre correctement le chemin vers la nouvelle DLL. De plus, parce que je n'ai pas installé l'ancienne DLL sur le système, elle n'apparaît pas dans mon GAC (bien que v2.0.0.0 le fasse, comme prévu).
J'ai ensuite activé la visionneuse du journal de fusion pour essayer de comprendre pourquoi il recherche cette ancienne version, mais pas de chance:
Assembly Load Trace: The following information can be helpful to determine why the assembly 'XXXXXX, Version=1.0.0.0, Culture=neutral, PublicKeyToken=121fae78165ba3d4' could not be loaded.
=== Pre-bind state information ===
LOG: User = MyComp\me
LOG: DisplayName = XXXXXX, Version=1.0.0.0, Culture=neutral, PublicKeyToken=121fae78165ba3d4
(Fully-specified)
LOG: Appbase = file:///d:/My Documents/Visual Studio 2010/Projects/CoolProj/WebApp/
LOG: Initial PrivatePath = d:\My Documents\Visual Studio 2010\Projects\CoolProj\WebApp\bin
Calling assembly : WebApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: d:\My Documents\Visual Studio 2010\Projects\CoolProj\WebApp\web.config
LOG: Using host configuration file:
LOG: Using machine configuration file from C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\config\machine.config.
LOG: Post-policy reference: XXXXXX, Version=1.0.0.0, Culture=neutral, PublicKeyToken=121fae78165ba3d4
LOG: Attempting download of new URL file:///C:/WINDOWS/Microsoft.NET/Framework/v4.0.30319/Temporary ASP.NET Files/root/90233b18/10d54998/XXXXXX.DLL.
LOG: Attempting download of new URL file:///C:/WINDOWS/Microsoft.NET/Framework/v4.0.30319/Temporary ASP.NET Files/root/90233b18/10d54998/XXXXXX/XXXXXX.DLL.
LOG: Attempting download of new URL file:///d:/My Documents/Visual Studio 2010/Projects/CoolProj/WebApp/bin/XXXXXX.DLL.
WRN: Comparing the assembly name resulted in the mismatch: Major Version
ERR: Failed to complete setup of assembly (hr = 0x80131040). Probing terminated.
Tout ce qu'il dit c'est qu'il commence par chercher cette ancienne assemblée. J'ai essayé de trouver une solution en ligne et j'ai vu cette question SO similaire , mais cela semble être exactement le contraire de mon problème. Le programme de cet interrogateur trouvait la mauvaise DLL au lieu de celle référencée. Alors que mon problème est que le programme recherche mystérieusement la mauvaise DLL et est incapable de la trouver lorsque la bonne se trouve localement dans le dossier bin et dans le GAC.
Pourquoi le mien cherche-t-il l'ancienne version? Où puis-je rechercher pour trouver cette mauvaise référence?