С#: не удалось загрузить типы из сборки

После добавления Lucene.net и Lucene.net Contrib на С# MVC3, я получаю сообщение ниже после первого успешного запуска. После получения этой ошибки мне нужно полностью стереть файлы C:\Users\Me\AppData\Local\Temp\Temporary ASP.NET, прежде чем я снова смогу запустить проект.

Я попытался удалить файлы Lucene вручную (включая ссылки в моем проекте) и переустановить их - как с NuGet, так и вручную - но это всегда такая же ситуация; после того, как проект был запущен один раз, я начинаю получать следующие ошибки:

Примечание. Contrib.Regex является частью Lucene.net Contrib.

Server Error in '/' Application.

Could not load types from assembly Contrib.Regex, Version=2.9.4.0, Culture=neutral, PublicKeyToken=85089178b9ac3181, errors:
Exception: System.IO.FileLoadException: Could not load file or assembly 'Lucene.Net, Version=2.9.4.1, Culture=neutral, PublicKeyToken=85089178b9ac3181' or one of its dependencies. The located assembly manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
File name: 'Lucene.Net, Version=2.9.4.1, Culture=neutral, PublicKeyToken=85089178b9ac3181'

=== Pre-bind state information ===
LOG: User = rcw7\Me
LOG: DisplayName = Lucene.Net, Version=2.9.4.1, Culture=neutral, PublicKeyToken=85089178b9ac3181
(Fully-specified)
LOG: Appbase = file:///C:/Development/Projects/Foobar/Foobar/
LOG: Initial PrivatePath = C:\Development\Projects\Foobar\Foobar\bin
Calling assembly : Contrib.Regex, Version=2.9.4.0, Culture=neutral, PublicKeyToken=85089178b9ac3181.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: C:\Development\Projects\Foobar\Foobar\web.config
LOG: Using host configuration file: C:\Users\Me\Documents\IISExpress\config\aspnet.config
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config.
LOG: Post-policy reference: Lucene.Net, Version=2.9.4.1, Culture=neutral, PublicKeyToken=85089178b9ac3181
LOG: Attempting download of new URL file:///C:/Users/Me/AppData/Local/Temp/Temporary ASP.NET Files/root/e9b4cfa4/edfa73f8/Lucene.Net.DLL.
WRN: Comparing the assembly name resulted in the mismatch: Revision Number
ERR: Failed to complete setup of assembly (hr = 0x80131040). Probing terminated.
Exception: System.IO.FileLoadException: Could not load file or assembly 'Lucene.Net, Version=2.9.4.1, Culture=neutral, PublicKeyToken=85089178b9ac3181' or one of its dependencies. The located assembly manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
File name: 'Lucene.Net, Version=2.9.4.1, Culture=neutral, PublicKeyToken=85089178b9ac3181'

Полный вывод здесь: http://pastebin.com/Vbu4VK7B

Первоначально я думал, что это проблема локальная для моей среды разработки, но после восстановления и копирования проекта на наш сервер я получаю те же ошибки.

Любые предложения о том, как преодолеть это?: -)

Ответ 1

Как оказалось, адский DLL не был вызван моим собственным вмешательством в конфигурации и скомпилированные библиотеки. Фактически это было вызвано столкновением моей недавно загруженной версии Lucene.NET и несколько устаревшей версии в комплекте с Examine, которая, в свою очередь, была связана с Umbraco 5.

По-видимому, устаревший, связанный Lucene.NET попал в теневой кэш (временные файлы ASP.NET), поэтому после следующего компиляции или перезапуска IIS выполнение прерывается. Очистка теневого кэша позволит выполнить одно успешное выполнение.

Странным было то, что я не смог найти какую-либо ссылку в любом месте отладочного вывода, который намекал на устаревшую версию Lucene.NET, с указанием пути к каталогу или номера версии. Проблема была замечена сравнением размеров файлов теневой копии Lucene.NET и версии, которую я хотел использовать. Они были отключены, поэтому я выполнил поиск Lucene.NET.dll и нашел тот, который был связан с Examine в дереве Umbraco (в разделе \App_Plugins\Examine)

Быстрое решение состояло в том, чтобы просто застегнуть плагин Examine, поэтому Umbraco его не увидит. Это оставляет меня без плагина Examine, но я все равно не использовал его.

Правильным решением, вероятно, было бы сказать приложению, что он должен игнорировать предыдущие версии Lucene.NET, но до сих пор мне не повезло. Это то, что я добавил в web.config:

<dependentAssembly>
    <assemblyIdentity name="Lucene.Net" publicKeyToken="85089178b9ac3181" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-2.9.4.1" newVersion="2.9.4.1" />
</dependentAssembly>

Это, похоже, не имело никакого эффекта, и устаревшая версия все же попала в теневой кеш. Я переместил этот вопрос здесь: Как заставить Umbraco 5 игнорировать связанный (с Examine) Lucene.NET

Спасибо за вашу помощь и предложения - он указал мне в правильном направлении!: -)

Ответ 2

Это обычно означает, что у вас есть файлы в GAC, которые являются другой версией, а другие в вашем ящике - это другая версия. Таким образом, ваше приложение указывает на версию и находит другое. Это запутывается. Вы хотите удалить Lucene.net. После удаления, загляните в папку c:\windows\assembly и убедитесь, что там нет файлов Lucene. Если есть, щелкните правой кнопкой мыши и удалите. Затем вы можете установить еще раз.

Ответ 3

manifest definition does not match означает, что есть проблема с разрешением сборки. см. этот вопрос SO

[править]

Ассембли загружаются из GAC, затем каталогов lib/bin в вашем приложении, а затем каталоги, указанные через <HintPath> в вашем проекте. Убедитесь, что у вас есть

Specific Version = True и Copy Local = True

в окне ссылочных свойств.

Ассембли из частных путей в вашем приложении (каталоги lib/bin) являются единственными, которые получают теневое копирование. Возможно, Contrib.Regex теневое копирование, а ядро ​​Lucene.NET - нет.

[/править]

Каталог под ASP.NET Temporary Files, который вы протираете, представляет собой каталог теневой копии. Возможно, возникла проблема с копированием этой сборки, которая может быть разрешением для вашей учетной записи домена. Вы можете проверить эту теорию, изменив каталог shadowcopy или полностью отключив теневое копирование, как описано здесь:

Вы можете изменить этот каталог в Application_Start, как описано в fooobar.com/questions/305708/...

Вы можете отключить теневое копирование в файле web.config:

<hostingEnvironment shadowCopyBinAssemblies="false" />

Ответ 4

Вы можете использовать Fusion Log Viewer для диагностики этих проблем. Это дает вам полную информацию о типах, которые не удалось загрузить, аналогично тому, что вы сообщили здесь. Надеюсь, это поможет.