.NET DLL зависимость одного и того же файла
Я обновил один из наших веб-сайтов и был награжден этой ошибкой:
=== Pre-bind state information ===
LOG: User = NT AUTHORITY\NETWORK SERVICE
LOG: DisplayName = <assembly>, Version=2.0.42.64, Culture=neutral, PublicKeyToken=c445f6f924945bd1
(Fully-specified)
LOG: Appbase = file:///E:/Web/
LOG: Initial PrivatePath = E:\Web\bin
Calling assembly : <assembly>, Version=2.0.42.67, Culture=neutral, PublicKeyToken=c445f6f924945bd1.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: E:\Web\web.config
LOG: Using host configuration file: C:\Windows\Microsoft.NET\Framework\v2.0.50727\Aspnet.config
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\v2.0.50727\config\machine.config.
LOG: Post-policy reference: <assembly>, Version=2.0.42.64, Culture=neutral, PublicKeyToken=c445f6f924945bd1
LOG: Attempting download of new URL file:///C:/Windows/Microsoft.NET/Framework/v2.0.50727/Temporary ASP.NET Files/root/5ee48cb7/31fcfc81/<assembly>.DLL.
LOG: Attempting download of new URL file:///C:/Windows/Microsoft.NET/Framework/v2.0.50727/Temporary ASP.NET Files/root/5ee48cb7/31fcfc81/<assembly>/<assembly>.DLL.
LOG: Attempting download of new URL file:///E:/Web/bin/<assembly>.DLL.
WRN: Comparing the assembly name resulted in the mismatch: Revision Number
ERR: Failed to complete setup of assembly (hr = 0x80131040). Probing terminated.
куда <assembly>
это имя сборки.
Если я прочитал это правильно, сборка (.67) пытается загрузить себя, но предыдущая (.64) и терпит неудачу, потому что очевидно, что файл не может иметь 2 версии...
Что может вызвать эту проблему? Это моя конфигурация или сборка сборки, которая не так?
2 ответа
Теперь я нашел причину сообщения об ошибке и разместил его здесь, чтобы оно могло помочь другим.
Существовали две сборки с циклической зависимостью, одна из которых не имела строгой проверки версий:
a1(.67) -> a2(.11) -> a1(.64)
куда a1
а также a2
являются названиями сборок, а номера в скобках являются ревизиями.
Так что на самом деле происходит то, что первая сборка загружает старую сборку, которая, в свою очередь, пытается загрузить старую ревизию сборки. Тогда сообщение об ошибке скажет вам, что a1(.67)
пытается загрузить a1(.64)
и пропускает всю цепочку загрузочных сборок.
Чтобы помочь с отладкой этого a1
должен быть строгим о том, что пересмотр a2
это должно быть загружено. Тогда сообщение об ошибке скажет вам, что a2
Старый.
Я видел это один или два раза, когда у меня были объекты в кэше или сеансе, и я создал новую версию сборки и просто скопировал ее поверх оригинала, пока приложение еще работает. Исправление состояло в том, чтобы перезапустить приложение ASP.NET и удалить временные файлы ASP.NET.