На 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 для диагностики этой проблемы. Это дает вам полную информацию о типах не удалось загрузить аналогично тому, который вы сообщили здесь. Надеюсь, это поможет.