.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.

Другие вопросы по тегам