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

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

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

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

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's 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 = rcw7Me
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:DevelopmentProjectsFoobarFoobarbin
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:DevelopmentProjectsFoobarFoobarweb.config
LOG: Using host configuration file: C:UsersMeDocumentsIISExpressconfigaspnet.config
LOG: Using machine configuration file from C:WindowsMicrosoft.NETFrameworkv4.0.30319configmachine.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's 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

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

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

4 ответов


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

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

странная вещь заключалась в том, что я не смог найти ссылку в любом месте вывода отладки, которая намекала на устаревшую версию Lucene.NET, либо с каталогом путь или номер версии. Проблема была обнаружена путем сравнения размеров файлов теневой скопированной версии Lucene.NET и версия, которую я намеревался использовать. Они были выключены, поэтому я поискал Lucene.NET.dll и нашел тот в комплекте с Examine в дереве Умбрако (под \App_Plugins\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

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


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


на manifest definition does not match означает, что существует проблема с резолюцией ассамблеи. см. это так вопрос

[edit]

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

Specific Version = True и Copy Local = True

в окне свойств ссылки.

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

[/edit]

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

вы можете изменить этот каталог в Application_Start, как описано в https://stackoverflow.com/a/2847495/151445

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

<hostingEnvironment shadowCopyBinAssemblies="false" />


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