Eu apenas copiei um projeto existente em uma máquina nova para começar a desenvolvê-la e tive um problema com a versão de um dos meus assemblies referenciados (uma DLL telerik por acaso).
O projeto originalmente referenciou uma versão mais antiga do assembly (vamos chamá-lo v1.0.0.0). Minha nova máquina possui a versão mais recente do assembly instalada, então pensei em atualizá-la (vamos chamar a nova versão v2.0.0.0).
Agora, aqui está o problema: se eu copiar a dll v1.0.0.0 antiga para a pasta do projeto e adicioná-la como referência, o site será iniciado sem problemas. Se eu excluir essa referência (e também excluir a DLL antiga do meu sistema) e adicionar a nova versão (v2.0.0.0), a página mostrará a seguinte exceção:
Não foi possível carregar o arquivo ou o conjunto 'XXXXXX, Versão = 1.0.0.0, Culture = neutral, PublicKeyToken = 121fae78165ba3d4' ou uma de suas dependências. A definição de manifesto da montagem localizada não corresponde à referência da montagem. (Exceção de HRESULT: 0x80131040)
Claramente, o código está procurando a versão desatualizada e não a encontra. Mas por que?
Procurei na pasta da solução esse número de versão e não consegui encontrar uma única referência. Verifiquei o texto do arquivo .csproj e verifiquei que a versão mostra corretamente a versão mais recente e o HintPath mostra corretamente o caminho para a nova DLL. Além disso, como eu não instalei a DLL antiga no sistema, ela não aparece no meu GAC (embora a v2.0.0.0 apareça como esperado).
Habilitei o visualizador de log de fusão a tentar descobrir por que ele está procurando essa versão antiga, mas sem sorte:
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.
Tudo o que diz é que começa procurando aquela assembléia antiga. Tentei encontrar uma solução on-line e vi essa pergunta SO semelhante , mas parece ser exatamente o oposto do meu problema. O programa desse questionador estava encontrando a DLL errada em vez da referenciada. Considerando que o meu problema é que o programa está procurando misteriosamente a DLL errada e não consegue encontrá-la quando a correta pode ser encontrada localmente na pasta bin e no GAC.
Por que o meu está procurando a versão antiga? Onde mais posso procurar para encontrar essa referência ruim?