Не удалось загрузить файл или сборку 'System.Data.SQLite'
Вопрос
Я установил ELMAH 1.1 .Net 3.5 x64 в свой проект ASP.NET и теперь я получаю эту ошибку (всякий раз, когда я пытаюсь просмотреть какую-либо страницу):
Не удалось загрузить файл или сборку 'System.Data.SQLite, версия= 1.0.61.0, Язык интерфейса= нейтральный, PublicKeyToken=db937bc2d44ff139' или одна из его зависимостей.Попытка Была предпринята попытка загрузить программу с неправильным форматом.
Описание: Необработанное исключение возникло во время выполнение текущего веб-запроса .Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.
Сведения об исключении:Система.Исключение BadImageFormatException:Не удалось не загрузить файл или сборку 'System.Data.SQLite, версия= 1.0.61.0, Язык интерфейса = нейтральный, PublicKeyToken=db937bc2d44ff139' или одна из его зависимостей.Попытка Была предпринята попытка загрузить программу с неправильным форматом.
Более подробная информация об ошибке приведена внизу.
Моей платформой активного решения является "Любой процессор", и я работаю на 64-разрядной Windows 7, разумеется, на 64-разрядном процессоре.Причина, по которой мы используем эту версию ELMAH, заключается в том, что 1.0 .Net 3.5 (x86, которая является единственной платформой, для которой она скомпилирована) выдала нам эту же ошибку на нашем сервере Windows x64.
Я пробовал компилировать для x86 и x64 и получаю ту же ошибку.Я попытался удалить все выходные данные компилятора (bin и obj).Наконец, я сделал прямую ссылку на библиотеку dll SQLite, что не было необходимо для работы проекта на сервере, и я получил эту ошибку компилятора:
Ошибка 1 Предупреждение как Ошибка:Генерация сборки - Ссылочная сборка 'System.Data.SQLite.dll' предназначена для другого процессора MyProject
Есть какие-нибудь идеи, в чем может заключаться проблема?
Дополнительные сведения об ошибке:
Ошибка источника:
Было сгенерировано необработанное исключение во время выполнения текущего веб-запрос.Информация о происхождении и местоположении исключения может быть идентифицирована с помощью приведенной ниже трассировки стека исключений .
Трассировка стека:
[Исключение BadImageFormatException:Не удалось загрузить файл или сборку 'System.Data.SQLite, Версия=1.0.61.0, Культура=нейтральная, PublicKeyToken=db937bc2d44ff139' или одна из его зависимостей.Попытка Была предпринята попытка загрузить программу с неправильным форматом.]
Система.Отражение.Сборка._nLoad(имя сборки Имя файла, Строковая кодовая база, Доказательство assemblySecurity, Сборка locationHint, StackCrawlMark& stackMark, логическое значение throwOnFileNotFound, логическое значение Предварительный просмотр) +0
Система.Отражение.Сборка.nLoad(имя сборки Имя файла, Строковая кодовая база, Доказательство assemblySecurity, Сборка locationHint, StackCrawlMark& stackMark, логическое значение throwOnFileNotFound, логическое значение Форинтроспекция) +43
Система.Отражение.Сборка.Внутренняя загрузка (AssemblyName AssemblyRef, доказательство assemblySecurity, StackCrawlMark& stackMark, логический анализ) +127 Система.Отражение.Сборка.Внутренняя загрузка (строка assemblyString, доказательство assemblySecurity, StackCrawlMark & stackMark, логический анализ) +142 Система.Отражение.Сборка.Загрузка (строка assemblyString) +28
System.Web.Configuration.Раздел компиляции.LoadAssemblyHelper(строка AssemblyName, логический параметр starDirective) +46[Исключение ConfigurationErrorsException:Не удалось не загрузить файл или сборку 'System.Data.SQLite, версия= 1.0.61.0, Язык интерфейса = нейтральный, PublicKeyToken=db937bc2d44ff139' или одна из его зависимостей.Попытка Была предпринята попытка загрузить программу с неправильным форматом.]
Система.Веб.Конфигурация.Раздел компиляций.LoadAssemblyHelper(Строка AssemblyName, логический параметр starDirective) +613 Система.Веб.Конфигурация.Раздел компиляции.Загрузите все сборки из каталога Appdomainbindirectory() +203 System.Web.Configuration.Раздел компиляции.Загрузка при сборке (AssemblyInfo ai) +105
System.Web.Compilation.BuildManager.GetReferencedAssemblies(раздел компиляции compConfig) +178
System.Web.Compilation.BuildProvidersCompiler..ctor(виртуальный путь configPath, логическое значение Поддержка локализации, строка outputAssemblyName) +54
System.Web.Compilation.ApplicationBuildProvider.GetGlobalAsaxBuildResult(логическое значение isPrecompiledApp) +232
System.Web.Compilation.BuildManager.CompileGlobalAsax() +52 System.Web.Compilation.BuildManager.EnsureTopLevelFilesCompiled() +337[HttpException (0x80004005):Не удалось загрузить файл или сборку 'System.Data.SQLite, Версия=1.0.61.0, Культура=нейтральная, PublicKeyToken=db937bc2d44ff139' или одна из его зависимостей.Попытка Была предпринята попытка загрузить программу с неправильным форматом.]
System.Web.Compilation.BuildManager.Исключение ReportTopLevelCompilationException() +58 Система.Веб.Компиляция.BuildManager.EnsureTopLevelFilesCompiled() +512 System.Web.Hosting.Среда хостинга.Инициализировать (ApplicationManager AppManager, IApplicationHost AppHost, IConfigMapPathFactory configMapPathFactory, Параметры среды размещения Параметры хостинга) +729[HttpException (0x80004005):Не удалось загрузить файл или сборку 'System.Data.SQLite, Версия=1.0.61.0, Культура=нейтральная, PublicKeyToken=db937bc2d44ff139' или одна из его зависимостей.Попытка Была предпринята попытка загрузить программу с неправильным форматом.]
System.Web.HttpRuntime.FirstRequestInit(HttpContext контекст) +8896783
System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext контекст) +85
System.Web.HttpRuntime.Внутренний запрос процесса (HttpWorkerRequest wr) +259
Решение
System.Data.SQLite.dll
является смешанной сборкой, т.е.он содержит как управляемый, так и машинный код.Поэтому особое System.Data.SQLite.dll
это либо x86, либо x64, но никогда не то и другое одновременно.
Обновление (любезно предоставлено Дж .Пабло Фернандес): Cassini, веб-сервер разработки, используемый Visual Studio при нажатии клавиши F5 или зеленой кнопки «воспроизвести", доступен только для x86, что означает, что даже если ваша рабочая станция 64-разрядная, вы сможете использовать только x86 версию System.Data.SQLite.dll .
Альтернативой является использование не Cassini, а IIS7, который на самом деле является x64.
Другие советы
Убедитесь, что для параметра "Включить 32-разрядные приложения" установлено значение false для пула приложений.
Перейти к IIS7 Application Pool -> advanced settings and set the 32-bit application to true
.
Это очень просто, если вы не используете SQLite:
Вы можете удалить библиотеки DLL SQLite из папок bin вашего решения, а затем из папки, в которой вы ссылаетесь на ELMAH.Перестройте, и ваше приложение не будет пытаться загрузить эту библиотеку DLL, которую вы не используете.
У меня есть 64-разрядная машина разработки и 32-разрядный сервер сборки.Я использовал этот код до инициализации NHibernate.Прекрасно работает на любой архитектуре (ну, на 2-х, которые я тестировал).
Надеюсь, это кому-то поможет.
Гвидо
private static void LoadSQLLiteAssembly()
{
Uri dir = new Uri(Assembly.GetExecutingAssembly().CodeBase);
FileInfo fi = new FileInfo(dir.AbsolutePath);
string binFile = fi.Directory.FullName + "\\System.Data.SQLite.DLL";
if (!File.Exists(binFile)) File.Copy(GetAppropriateSQLLiteAssembly(), binFile, false);
}
private static string GetAppropriateSQLLiteAssembly()
{
string pa = Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE");
string arch = ((String.IsNullOrEmpty(pa) || String.Compare(pa, 0, "x86", 0, 3, true) == 0) ? "32" : "64");
return GetLibsDir() + "\\NUnit\\System.Data.SQLite.x" + arch + ".DLL";
}
Как человек, которому приходилось сталкиваться с довольно большим количеством сообщений об ошибках в Roadkill Wiki с точно такой же проблемой, это то, что вам нужно сделать:
- Вы используете x64 или x86?Sqlite поставляется с библиотеками DLL для отдельных архитектур - скопируйте нужную в вашу папку bin, есть две библиотеки DLL для официального поставщика:
System.Data.SQLite.dll
System.Data.SQLite.Linq.dll
- Если вы не можете утруждать себя поиском этих сборок, включите 32-разрядный режим для вашего пула приложений (обычно это решение только для машин разработчиков).
- Если вы размещаете на сервере, вам понадобится распространяемая среда выполнения Microsoft C ++ - по умолчанию она не установлена на Server 2008 R2. версия x64, версия x86
Это настоящая заноза в заднице, через сколько обручей вам приходится перепрыгивать при повторном распространении SQLite .ЧИСТЫЕ двоичные файлы, мое решение для Roadkill в конце концов состояло в том, чтобы скопировать правильные двоичные файлы в папку ~/ bin на основе используемой вами архитектуры.К сожалению, это не решает проблему времени выполнения C ++.
Я решил эту проблему, установив System.Data.SQLite с расширением Nuget.Это расширение можно использовать для Visual Studio 2010 или более поздней версии.Во-первых, вы должны установить расширение Nuget.Вы можете следить здесь:
- Перейдите в Visual Studio 2010, Меню -> Инструменты
- Выберите Менеджер расширений
- Введите NuGet в поле поиска и нажмите Онлайн-галерея.Ожидая, пока он Получит информацию…
- Выберите извлеченный менеджер пакетов NuGet, нажмите Загрузить.Ожидая его Загрузки…
- Нажмите кнопку Установить в программе установки расширений Visual Studio NuGet Package Manager.Дождитесь завершения установки.
- Нажмите кнопку Закрыть и "Перезагрузите сейчас.
Во-вторых, теперь вы можете установить SQLite:
- Перейдите в меню СЕРВИС-> Диспетчер пакетов библиотеки-> Консоль диспетчера пакетов Visual Studio.
- Затем запустите команду Install-Package System.Data.SQLite в консоли диспетчера пакетов.Вот так:запустите команду Install-Package System.Data.SQLite в консоли диспетчера пакетов
И теперь вы можете использовать System.Data.SQLite.
В этом случае вы видите две папки x64 и x86, эти папки содержат SQLite.Interop.dll .Теперь перейдите в окна свойств этих библиотек DLL и установите действие сборки как содержимое, а копирование в выходной каталог - Копировать всегда.
Итак, это мой путь.
Спасибо.Ким Тхо Фам, Город Хочиминь, Вьетнам.Электронная почта:tho.phamkim@gmail.com
Сборка System.Data.SQLite, связанная с ручной загрузкой, может решить эту проблему.
Изменен код gatapia, как показано ниже:
public static void LoadSQLLiteAssembly()
{
Uri dir = new Uri(Assembly.GetExecutingAssembly().CodeBase);
FileInfo fi = new FileInfo(dir.AbsolutePath);
string appropriateFile = Path.Combine(fi.Directory.FullName, GetAppropriateSQLLiteAssembly());
Assembly.LoadFrom(appropriateFile);
}
private static string GetAppropriateSQLLiteAssembly()
{
string pa = Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE");
string arch = ((String.IsNullOrEmpty(pa) || String.Compare(pa, 0, "x86", 0, 3, true) == 0) ? "32" : "64");
return "System.Data.SQLite.x" + arch + ".DLL";
}
Я получил эту ошибку, когда наш Windows server был преобразован с 32-разрядной ОС на 64-разрядную.Сборка, которая выдавала ошибку, была настроена на компиляцию в режиме x86 (т.е. в режиме 32).Я переключил его на "Любой процессор", и это сделало свое дело.Вы можете изменить это значение, выполнив следующие действия:
щелкните правой кнопкой мыши на проекте, перейдите к Properties -> Build -> Platform Target -> change to "Any CPU"
В нашем случае это не сработало, потому что на нашем производственном сервере отсутствовал
Распространяемый пакет Microsoft Visual C++ 2010 SP1 (x86)
Мы установили его, и все работает нормально.Для пула приложений должно быть установлено значение Enable 32-разрядные приложения true, и вы должны использовать версию библиотеки x86
Я решил эту проблему, как ни странно, установив System.Data.SQLite через графическое приложение Nuget, в отличие от консоли диспетчера пакетов.
Установка через консоль не включала зависимости, необходимые этой библиотеке для запуска.
Я придумал 2 быстрых решения.Либо работай на меня.Я думаю, проблема в разрешениях.
1) Вместо того, чтобы использовать файл Elmah.dll из каталога net-2.0, я использовал Elmah.dll из net-1.1 .
2) Вместо того, чтобы хранить Elmah.dll в каталоге project bin.Я создаю каталог dll, чтобы поместить его в него.
Другой способ обойти эту проблему - просто обновить ваше приложение до версии ELMAH 1.2, а не 1.1.
System.Data.SQLite
имеет зависимость от System.Data.SQLite.interop
убедитесь, что оба пакета имеют одинаковую версию и являются x86.
Это старый вопрос, но я перепробовал все вышеперечисленное.Я работал над строго x86 проект, поэтому там не было двух папок /x86, /x64.Но по какой-то причине System.Data.SQLite
была другая версия по сравнению System.Data.SQLite.interop
, как только я удалил соответствующие библиотеки dll, проблема была исправлена.
Можете ли вы удалить папку отладки bin и перекомпилировать ее снова?
Или проверьте ссылку вашего проекта на System.Data.SQLite
, отследите, где он находится, затем откройте библиотеку dll в reflector.Если вы не можете открыть его, это означает, что библиотека dll повреждена, возможно, вы захотите найти правильную или переустановить .net Framework.
Если вы используете IIS Express в качестве веб-сервера на вашем компьютере разработки, я бы перешел на локальный IIS.У меня это сработало.
Это старое сообщение, но оно может помочь некоторым людям, ищущим эту ошибку, попробовать установить для параметра "Включить 32-разрядные приложения" значение True для пула приложений.Это то, что устранило ошибку для меня.Я пришел к этому решению, прочитав некоторые комментарии к ответу @beckelmw.
Скорее всего, у вас установлен неправильный пакет.Вы хотите, чтобы пакет был создан Майкрософт который реализует систему.Данные.Общая модель поставщика.