Ho appena copiato un progetto esistente su una macchina nuova di zecca per iniziare a svilupparlo e ho riscontrato un problema con la versione di uno dei miei assiemi di riferimento (una DLL di Telerik come accade).
Il progetto originariamente faceva riferimento a una versione precedente dell'assembly (chiamiamolo v1.0.0.0). La mia nuova macchina ha l'ultima versione dell'assembly installata, quindi ho pensato di aggiornarla (chiamiamo la nuova versione v2.0.0.0).
Ora ecco il problema: se copio la vecchia dll v1.0.0.0 nella cartella del progetto e la aggiungo come riferimento, il sito Web si avvia senza problemi. Se cancello quel riferimento (e cancello anche la vecchia DLL dal mio sistema) e aggiungo la nuova versione (v2.0.0.0), la pagina mostra la seguente eccezione:
Impossibile caricare il file o l'assembly 'XXXXXX, Versione = 1.0.0.0, Cultura = neutro, PublicKeyToken = 121fae78165ba3d4' o una delle sue dipendenze. La definizione manifest dell'assembly individuato non corrisponde al riferimento dell'assembly. (Eccezione da HRESULT: 0x80131040)
Chiaramente, il codice sta cercando la versione non aggiornata e non la trova. Ma perché?
Ho grepped la cartella della soluzione per quel numero di versione e non sono riuscito a trovare un singolo riferimento. Ho ricontrollato il testo del file .csproj e ho scoperto che la versione mostra correttamente l'ultima versione e che HintPath mostra correttamente il percorso della nuova DLL. Inoltre, poiché non ho installato la vecchia DLL sul sistema, questa non viene visualizzata nel mio GAC (sebbene v2.0.0.0 funzioni, come previsto).
Ho quindi abilitato il visualizzatore log di fusione per provare a capire perché sta cercando quella vecchia versione, ma senza fortuna:
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.
Tutto ciò che dice che inizia cercando quella vecchia assemblea. Ho provato a trovare una soluzione online e ho visto questa simile domanda SO , ma sembra essere l'esatto contrario del mio problema. Il programma di quell'interrogatore stava trovando la DLL sbagliata anziché quella referenziata. Considerando che il mio problema è che il programma sta misteriosamente cercando la DLL errata e non è in grado di trovarla quando quella giusta può essere trovata localmente nella cartella bin e nel GAC.
Perché il mio sta cercando la vecchia versione? Dove altro posso cercare per trovare questo riferimento errato?




