Я просто скопировал существующий проект на новую машину, чтобы начать разработку на нем, и столкнулся с проблемой с версией одной из моих сборок, на которую я ссылаюсь (как это бывает, с библиотекой telerik).
Первоначально проект ссылался на более старую версию сборки (назовем ее v1.0.0.0). На моем новом компьютере установлена последняя версия сборки, поэтому я решил обновить ее (назовем новую версию v2.0.0.0).
Проблема вот в чем: если я скопирую старую dll v1.0.0.0 в папку проекта и добавлю ее в качестве ссылки, веб-сайт запустится без проблем. Если я удалю эту ссылку (а также удалю старую DLL из своей системы) и добавлю новую версию (v2.0.0.0), на странице появится следующее исключение:
Не удалось загрузить файл или сборку XXXXXX, Версия = 1.0.0.0, Культура = нейтральный, PublicKeyToken = 121fae78165ba3d4 или одну из их зависимостей. Определение манифеста обнаруженной сборки не соответствует ссылке на сборку. (Исключение из HRESULT: 0x80131040)
Очевидно, код ищет устаревшую версию и не может ее найти. Но почему?
Я нашел папку решения для этого номера версии и не смог найти ни одной ссылки. Я дважды проверил текст файла .csproj и обнаружил, что версия правильно показывает последнюю версию, а HintPath правильно показывает путь к новой DLL. Более того, поскольку я не устанавливал старую DLL в систему, она не отображается в моем GAC (хотя v2.0.0.0, как и ожидалось).
Затем я включил просмотрщик журнала слияния, чтобы попытаться выяснить, почему он ищет эту старую версию, но безуспешно:
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.
Все это говорит о том, что он начинает с поиска той старой сборки. Я попытался найти решение в Интернете и увидел этот аналогичный вопрос SO , но, похоже, это полная противоположность моей проблеме. Программа этого вопрошающего находила неправильную DLL вместо указанной. В то время как моя проблема в том, что программа таинственным образом ищет не ту DLL и не может ее найти, когда нужную можно найти локально в папке bin и в GAC.
Почему я ищу старую версию? Где еще я могу найти эту плохую ссылку?