Właśnie skopiowałem istniejący projekt na zupełnie nową maszynę, aby rozpocząć na nim programowanie, i napotkałem problem z wersją jednego z moich zestawów, do których się odwołuję (jak to się dzieje, telerik DLL).
Projekt pierwotnie odwoływał się do starszej wersji zestawu (nazwijmy go v1.0.0.0). Mój nowy komputer ma zainstalowaną najnowszą wersję zestawu, więc pomyślałem, że go zaktualizowałem (nazwijmy nową wersję v2.0.0.0).
Oto problem: jeśli skopiuję starą bibliotekę dll v1.0.0.0 do folderu projektu i dodam ją jako odniesienie, witryna internetowa zostanie uruchomiona bez problemu. Jeśli usunę to odniesienie (a także usunę starą bibliotekę DLL z mojego systemu) i dodam nową wersję (v2.0.0.0), na stronie pojawi się następujący wyjątek:
Nie można załadować pliku lub zestawu „XXXXXX, wersja = 1.0.0.0, Culture = neutral, PublicKeyToken = 121fae78165ba3d4” lub jednej z jego zależności. Definicja manifestu zlokalizowanego zestawu nie jest zgodna z odwołaniem do zestawu. (Wyjątek od HRESULT: 0x80131040)
Oczywiście kod szuka nieaktualnej wersji i nie może jej znaleźć. Ale dlaczego?
Wyszukałem folder rozwiązania dla tego numeru wersji i nie mogłem znaleźć ani jednego odwołania. Dokładnie sprawdziłem tekst pliku .csproj i stwierdziłem, że wersja poprawnie pokazuje najnowszą wersję, a HintPath poprawnie pokazuje ścieżkę do nowej biblioteki DLL. Ponadto, ponieważ nie zainstalowałem starej biblioteki DLL w systemie, nie pojawia się ona w moim GAC (chociaż wersja 2.0.0.0 robi, zgodnie z oczekiwaniami).
Następnie włączyłem przeglądarkę dziennika fuzji, aby spróbować dowiedzieć się, dlaczego szuka tej starej wersji, ale bez powodzenia:
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.
Mówi się tylko o tym, że zaczyna się od szukania tego starego zestawu. Próbowałem znaleźć rozwiązanie online i widziałem to podobne pytanie SO , ale wydaje się, że jest to dokładne przeciwieństwo mojego problemu. Program tego pytającego znajdował niewłaściwą bibliotekę DLL zamiast przywoływanej. Natomiast mój problem polega na tym, że program w tajemniczy sposób szuka niewłaściwej biblioteki DLL i nie może jej znaleźć, gdy właściwą można znaleźć lokalnie w folderze bin i GAC.
Dlaczego szukam starej wersji? Gdzie jeszcze mogę szukać, aby znaleźć to złe odniesienie?