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


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

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

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

Сведения Об Исключении : Система.Исключение Badimageformatexception: Не Могли Бы не загружать файл или сборку - Система.Данные.SQLite, Version=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, Version=1.0.61.0, Культура=нейтральный, PublicKeyToken=db937bc2d44ff139 ' или одна из его зависимостей. Попытка было сделано для загрузки программы с помощью неверный формат.]
Система.Отображение.Собрание._nLoad(Имя_сборки имя файла, строковая кодовая база, доказательства значение параметра assemblysecurity, сборка locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection) +0
Система.Отображение.Собрание.мой отчет(Имя_сборки имя файла, строковая кодовая база, доказательства значение параметра 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
Система.Сеть.Конфигурация.Компиляции.LoadAssemblyHelper (Строка имя_сборки, логическое starDirective) +46

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

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

18 117

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 я проверял)

надеюсь, это кому-то поможет.

Guido

        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.dllSystem.Data.SQLite.Linq.dll
  • если вы не можете быть обеспокоены охотой вокруг этих сборок, включите 32-разрядный режим для вашего пула приложений (решение для машин dev только обычно)
  • если вы размещаете на сервере, вам понадобится распространяемая среда выполнения Microsoft C++ - она не установлена на сервере 2008 R2 по умолчанию. x64 версия, x86 версия

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

ручная система, связанная с нагрузкой.Данные.Сборка SQLite может решить эту проблему.

изменен код гатапии, как показано ниже:

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

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

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

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

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

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

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

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

и теперь, вы можете использовать системы.Данные.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 проект, поэтому не было двух папок /x86, / x64. Но по какой-то причине System.Data.SQLite была другая версия System.Data.SQLite.interop, Как только я вытащил соответствующие DLL проблема была исправлена.

вы можете удалить папку отладки bin и снова перекомпилировать?

или проверьте ссылку на проект System.Data.SQLite, отследить, где он находится, а затем откройте dll в отражателе. Если вы не можете открыть его, это означает, что dll поврежден, вы можете найти правильный или переустановить .net framework.

Если вы используете IIS Express в качестве веб-сервера на своей машине разработки, я бы перешел на локальный IIS. Это сработало для меня.

Это старый пост, но это может помочь некоторым людям, ищущим эту ошибку, попробовать установить "включить 32-разрядные приложения" в True для пула приложений. Это то, что разрешило ошибку для меня. Я пришел к этому решению, прочитав некоторые комментарии к ответу @beckelmw.

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