Не удалось загрузить файл или сборку 'System.Data.SQLite'

StackOverflow https://stackoverflow.com/questions/1278929

  •  16-09-2019
  •  | 
  •  

Вопрос

Я установил 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:

И теперь вы можете использовать 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.

Скорее всего, у вас установлен неправильный пакет.Вы хотите, чтобы пакет был создан Майкрософт который реализует систему.Данные.Общая модель поставщика.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top