Не удалось загрузить файл или сборку 'System.Данные.Базы данных SQLite'

Я установил ELMAH 1.1 .Net 3.5 x64 в моем ASP.NET проект, и теперь я получаю эту ошибку (всякий раз, когда я пытаюсь увидеть любую страницу):

не удалось загрузить файл или сборку - Система.Данные.Базы Данных SQLite Версии=1.0.61.0, Культура=нейтральный, PublicKeyToken=db937bc2d44ff139 ' или одна из его зависимостей. Попытка был сделан для загрузки программы с помощью неверный формат.

Описание: необработанное исключение произошло во время выполнение текущего сеть запрос. Просмотрите трассировку стека дополнительные сведения об ошибке и откуда он взялся в коде.

Сведения Об Исключении : Система.Исключение Badimageformatexception: Не Могли Бы не загружать файл или сборку - Система.Данные.Базы Данных SQLite Версии=1.0.61.0, Культура=нейтральный, PublicKeyToken=db937bc2d44ff139 ' или одна из его зависимостей. Попытка был сделан для загрузки программы с помощью неверный формат.

больше деталей ошибки на дно.

моя активная платформа решения - "любой процессор", и я работаю на x64 Windows 7 на x64, конечно, процессор. Причина, по которой мы используем эту версию ELMAH, заключается в том, что 1.0 .Net 3.5 (x86, которая является единственной платформой, для которой она скомпилирована) дала нам эту же ошибку на нашем x64 Windows server.

Я пытался компилировать для x86 и x64 и я получаю ту же ошибку. Я попытался удалить все выходные данные компилятора (bin и obj). Наконец, я сделал ссылку на SQLite dll напрямую, то, что не было необходимо для работы проекта на сервере, и у меня есть эта ошибка компилятора:

Ошибка 1 предупреждение как ошибка: генерация сборки -- ссылочная сборка 'Система.Данные.Базы данных SQLite.dll " нацелена на другой процессор MyProject

есть идеи, в чем может быть проблема?

дополнительные сведения об ошибке:

Ошибка Источник:

необработанное исключение во время выполнение текущего веб-запрос. Информация о происхождение и местонахождение исключения можно определить с помощью исключения трассировка стека ниже.

Трассировка Стека:

[BadImageFormatException: не удалось загрузить файл или сборку - Система.Данные.Базы Данных SQLite Версии=1.0.61.0, Культура=нейтральный, PublicKeyToken=db937bc2d44ff139 ' или одна из его зависимостей. Попытка был сделан для загрузки программы с помощью неверный формат.]
Система.Отображение.Собрание._nLoad (AssemblyName имя файла, строковая кодовая база, доказательство значение параметра assemblysecurity, сборка locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection) +0
Система.Отображение.Собрание.nLoad (AssemblyName имя файла, строковая кодовая база, доказательство значение параметра assemblysecurity, сборка locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection) +43
Система.Отображение.Собрание.InternalLoad (AssemblyName параметр assemblyref, доказательства значение параметра assemblysecurity, StackCrawlMark& stackMark, Boolean forIntrospection) Система +127.Отображение.Собрание.InternalLoad (Строка assemblyString, доказательства значение параметра assemblysecurity, StackCrawlMark& stackMark, Boolean forIntrospection) Система +142.Отображение.Собрание.Загрузить (Строка assemblyString) +28
Система.Сеть.Конфигурация.CompilationSection.LoadAssemblyHelper (Строка имя сборки, логическое starDirective) +46

[ConfigurationErrorsException: Может не загружать файл или сборку - Система.Данные.Базы Данных SQLite Версии=1.0.61.0, Культура=нейтральный, PublicKeyToken=db937bc2d44ff139 ' или одна из его зависимостей. Попытка был сделан для загрузки программы с помощью неверный формат.]
Система.Сеть.Конфигурация.CompilationSection.LoadAssemblyHelper (Строка assemblyName, Boolean starDirective) +613 Система.Сеть.Конфигурация.CompilationSection.LoadAllAssembliesFromAppDomainBindirectory() Система +203.Сеть.Конфигурация.CompilationSection.LoadAssembly (AssemblyInfo ai) + 105
Система.Сеть.Сборник.BuildManager.GetReferencedAssemblies(CompilationSection compConfig) +178
Система.Сеть.Сборник.BuildProvidersCompiler..ctor (VirtualPath configPath, Boolean supportLocalization, строка outputAssemblyName) +54
Система.Сеть.Сборник.ApplicationBuildProvider.GetGlobalAsaxBuildResult (Логическое Значение isPrecompiledApp) +232
Система.Сеть.Сборник.BuildManager.CompileGlobalAsax() +52 системы.Сеть.Сборник.BuildManager.EnsureTopLevelFilesCompiled() +337

[HttpException (0x80004005): не удалось загрузить файл или сборку - Система.Данные.Базы Данных SQLite Версии=1.0.61.0, Культура=нейтральный, PublicKeyToken=db937bc2d44ff139 ' или одна из его зависимостей. Попытка был сделан для загрузки программа с неверный формат.]
Система.Сеть.Сборник.BuildManager.Исключение ReportTopLevelCompilationException() Система +58.Сеть.Сборник.BuildManager.EnsureTopLevelFilesCompiled() Система +512.Сеть.Размещающий.HostingEnvironment.Инициализировать(ApplicationManager appManager, IApplicationHost appHost, IConfigMapPathFactory configMapPathFactory, HostingEnvironmentParameters hostingParameters) +729

[HttpException (0x80004005): не удалось загрузить файл или собрание - Система.Данные.Базы Данных SQLite Версии=1.0.61.0, Культура=нейтральный, PublicKeyToken=db937bc2d44ff139 ' или одна из его зависимостей. Попытка был сделан для загрузки программы с помощью неверный формат.]
Система.Сеть.Строки httpruntime.FirstRequestInit (HttpContext контекст) +8896783
Система.Сеть.Строки httpruntime.EnsureFirstRequestInit (HttpContext контекст) +85
Система.Сеть.Строки httpruntime.ProcessRequestInternal (HttpWorkerRequest wr) +259

18 ответов


System.Data.SQLite.dll - это смешанная сборка, т. е. она содержит как управляемый код, так и собственный код. Следовательно, определенный System.Data.SQLite.dll либо x86, либо x64, но никогда оба.

обновление (любезность J. Пабло Фернандес): Cassini, веб-сервер разработки, используемый Visual Studio при нажатии F5 или Нажмите зеленую кнопку "play", является x86, что означает, что даже если ваша рабочая станция x64, вы сможете использовать только версию x86 Система.Данные.Базы данных 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-битная машина dev и 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-разрядный режим для пула приложений (решение для машин dev только обычно)
  • если вы размещаете на сервере, вам понадобится распространяемая среда выполнения Microsoft C++ - по умолчанию она не установлена на сервере 2008 R2. x64 версия, x86 версия

это настоящая боль в заднице, сколько обручей вам нужно перепрыгнуть при повторном распространении двоичных файлов SQLite .NET, моим решением для Roadkill в конце концов было скопировать правильные двоичные файлы в папку ~/bin на основе используемой вами архитектуры. К сожалению, это не решает проблему C++ runtime.


система ручной нагрузки родственная.Данные.Сборка 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 был преобразован из 32-разрядной ОС в 64-разрядную. Сборка, которая вызывала ошибку, была настроена на компиляцию в режиме x86 (т. е. в режиме 32). Я переключил его на" любой процессор", и это сделало трюк. Это значение можно изменить, выполнив следующие действия:

щелкните правой кнопкой мыши по проекту go to Properties -> Build -> Platform Target -> change to "Any CPU"


в нашем случае не сработало, потому что наш производственный сервер отсутствует

распространяемый пакет Microsoft Visual C++ 2010 SP1 (x86)

мы установили его, и все работает нормально. Пул приложений должен иметь значение true для 32-разрядных приложений Enable и версию библиотеки x86


Я решил это, установив систему.Данные.SQLite с расширением Nuget. Это расширение можно использовать для Visual Studio 2010 или выше. Во-первых, вы должны установить расширение Nuget. Вы можете следовать здесь:

  • перейдите в Visual Studio 2010, меню --> Инструменты
  • Выберите Менеджер Расширений
  • введите NuGet в поле поиска и нажмите Online Gallery. Ожидая его получить информацию...
  • выберите извлеченный менеджер пакетов NuGet, нажмите кнопку Загрузить. Ожидание загрузки...
  • Нажмите кнопку Установить в Диспетчере пакетов NuGet установщика расширений Visual Studio. Дождитесь завершения установки.
  • Нажмите кнопку Закрыть и Перезагрузить сейчас.

во-вторых, теперь вы можете установить SQLite:

и теперь вы можете использовать System.Данные.Базы данных SQLite.

в этом случае вы видите две папки x64 и x86, эти папки содержат SQLite.Взаимодействие.файл DLL. Теперь перейдите в окна свойств этих библиотек DLL и установите действие сборки-это контент, а копировать в выходной каталог-всегда копировать.

Итак, это мой путь.

спасибо. Ким Тхо Фам, Хошимин , Вьетнам. Электронная почта: tho.phamkim@gmail.com


Я решил это, как ни странно, при установке системы.Данные.SQLite через приложение NuGet GUI, в отличие от консоли диспетчера пакетов.

Установка через консоль не включать в зависимости, эта библиотека должна работать.


Я придумал 2 быстрых решений. Либо работай на меня. Я думаю, проблема в разрешениях.

1) вместо использования Elmah.dll-файл из каталога net-2.0, я использовал Elmah.dll из net-1.1 .

2) вместо того, чтобы держать Elmah.dll в каталоге bin проекта. Я делаю каталог dll, чтобы поместить его.


другой способ обойти это - просто обновить приложение до ELMAH 1.2, а не 1.1.


System.Data.SQLite зависит от System.Data.SQLite.interop убедитесь, что оба пакета имеют одинаковую версию и оба x86.

Это старый вопрос, но я пробовал все выше. Я работал над строго x86 project, поэтому не было двух папок / 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.


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