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

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

Не удалось загрузить файл или сборку System.Data.SQLite, Version = 1.0.61.0, Culture = нейтральный, PublicKeyToken = db937bc2d44ff139 или одну из их зависимостей. Была сделана попытка загрузить программу с неверным форматом.

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

Сведения об исключении: System.BadImageFormatException: не удалось загрузить файл или сборку System.Data.SQLite, Version = 1.0.61.0, Culture = нейтральный, PublicKeyToken = db937bc2d44ff139 или одну из его зависимостей. Была сделана попытка загрузить программу с неверным форматом.

Более подробная информация об ошибке внизу.

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

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

Ошибка 1 Предупреждение как ошибка: создание сборки - сборка, на которую указывает ссылка System.Data.SQLite.dll, предназначена для другого процессора MyProject

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

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

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

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

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

[BadImageFormatException: не удалось загрузить файл или сборку System.Data.SQLite, Version = 1.0.61.0, Culture = нейтральный, PublicKeyToken = db937bc2d44ff139 или одну из его зависимостей. Была сделана попытка загрузить программу с неправильным форматом.]
System.Reflection.Assembly._nLoad (AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark & ​​stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection) +0
System.Reflection.Assembly.nLoad (AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark & ​​stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection) +43
System.Reflection.Assembly.InternalLoadurity (AssemblyName stackMark, Boolean forIntrospection) +127 System.Reflection.Assembly.InternalLoad (String assemblyString, Evidence assemblySecurity, StackCrawlMark и stackMark, Boolean forIntrospection) +142 System.Reflection.Assembly.Load (String assemblyString) +28figuration System.Web .CompilationSection.LoadAssemblyHelper (String assemblyNam e, логическая звезда, директива) +46

[ConfigurationErrorsException: не удалось загрузить файл или сборку 'System.Data.SQLite, Version = 1.0.61.0, Culture = нейтральный, PublicKeyToken = db937bc2d44ff139' или одну из их зависимостей. Была сделана попытка загрузить программу с неправильным форматом.]
System.Web.Configuration.CompilationSection.LoadAssemblyHelper (String assemblyName, Boolean starDirective) +613 System.Web.Configuration.CompilationSection.LoadAllAssembliesFromAppDomainBinDirectory () +203 System. Web.Configuration.CompilationSection.LoadAssembly (AssemblyInfo ai) +105
System.Web.Compilation.BuildManager.GetReferencedAssemblies (CompilationSection compConfig) +178
System.Web.Compilation.BuildProvidersCompiler..ctor (VirtualPath configPocal, поддержка логических значений Локальная поддержка , String outputAssemblyName) +54
System.Web.Compilation.ApplicationBuildProvider.GetGlobalAsaxBuildResult (Boolean isPrecompiledApp) +232
System.Web.Compilation.BuildManager.CompileGlobalAsax () +52 System.Web.Compilation.BensureTanopiledLevelCompiled.EnsureTanopiled () ) +337

[HttpException (0x80004005): не удалось загрузить файл или сборку System.Data.SQLite, Version = 1.0.61.0, Culture = нейтральный, PublicKeyToken = db937bc2d44ff139 или одну из его зависимостей. Была сделана попытка загрузить программу с неправильным форматом.]
System.Web.Compilation.BuildManager.ReportTopLevelCompilationException () +58 System.Web.Compilation.BuildManager.EnsureTopLevelFilesCompiled () +512 System.Web.Hosting.HostingEnvironment .Initialize (ApplicationManager appManager, IApplicationHost appHost, IConfigMapPathFactory configMapPathFactory, HostingEnvironmentParameters hostingParameters) +729

[HttpException (0x80004005): не удалось загрузить файл или сборку System.Data.SQLite, Version = 1.0.61.0, Culture = нейтральный, PublicKeyToken = db937bc2d44ff139 или одну из его зависимостей. Была сделана попытка загрузить программу с неправильным форматом.]
System.Web.HttpRuntime.FirstRequestInit (контекст HttpContext) +8896783
System.Web.HttpRuntime.EnsureFirstRequestInit (контекст HttpContext) +85
Система .Web.HttpRuntime.ProcessRequestInternal (HttpWorkerRequest wr) +259


person pupeno    schedule 14.08.2009    source источник
comment
Журнал Fusion (привязка сборки) намного полезнее в таких случаях, чем этот лист трассировки стека.   -  person Anton Tykhyy    schedule 15.08.2009
comment
Похоже, проблема была в том, что Cassini - это x86.   -  person pupeno    schedule 15.08.2009
comment
У меня была такая же проблема, и мне пришлось отказаться от ELMAH из-за смешанной среды производства / разработки, которая у нас есть. Учитывая, что использование SQLite на производственном веб-сервере с высоким трафиком звучит не очень хорошо, и тот факт, что SQLite dll - единственная сборка в ELMAH, которая заставляет его иметь две разные версии для бит x86 и 64x, мне интересно, почему ребята из ELMAH тянут и сделайте его необязательным, а не тем, что есть сейчас.   -  person Khash    schedule 19.10.2010


Ответы (18)


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

Обновление (любезно предоставлено Дж. Пабло Фернандесом): Cassini, веб-сервер разработки, используемый Visual Studio, когда вы нажимаете F5 или зеленую кнопку «воспроизведение», поддерживает только x86, который означает, что даже если ваша рабочая станция x64, вы сможете использовать только x86-версию System.Data.SQLite.dll.

Альтернативой является использование не Cassini, а IIS7, который правильно x64.

person Anton Tykhyy    schedule 15.08.2009
comment
Я использую версию x64 на компьютере x64. - person pupeno; 15.08.2009
comment
Вы пробовали использовать версию x86? - person Anton Tykhyy; 15.08.2009
comment
Новая альтернатива, которая стала доступной незадолго до этого, - это использование IIS Express, который позволяет вам установить тип пула приложений, который вы хотите использовать. - person Raul Vejar; 30.04.2012
comment
@Raul Vejar: расскажите, пожалуйста, о том, как функция выбора пула приложений в IIS Express решает проблему 32-битной / 64-битной сборки. Спасибо - person Tim; 05.08.2014
comment
@Tim, эта функция позволяет вам выбрать тип пула приложений, который вы хотите использовать, 32 или 64 бит, таким образом, вы можете контролировать этот аспект, который был исправлен в Cassini, и работать с той же битовой библиотекой, которая у вас есть. Другими словами, если вы используете 32-разрядную версию библиотеки DLL SQLite, вам следует выбрать 32-разрядный пул приложений в IIS Express. Для 64-битной версии библиотеки следует выбрать 64-битный пул приложений. - person Raul Vejar; 07.08.2014
comment
Вы говорите, что несмешанная сборка может быть как x86, так и x64? - person Kyle Delaney; 09.03.2018

Убедитесь, что для пула приложений для параметра «Включить 32-разрядные приложения» установлено значение false.

person beckelmw    schedule 09.09.2009
comment
Это работает, если вы хотите использовать dll x86 на 64-битной машине. В нашем случае наша среда разработки и производственная среда не совпадают, поэтому это сработало лучше всего. - person Rob; 12.02.2010
comment
Установка для меня значения true фактически решила проблему. Думаю, Elmah по умолчанию поставляется с 32-битной сборкой sql lite. - person ; 13.12.2010
comment
+1 как для @Jirapong, так и для Сергея, потому что именно этим параметром мне пришлось манипулировать, чтобы все заработало. В моем случае я думаю, что у меня была x86-версия библиотеки SqlLite, и мне нужно было установить для параметра Enable 32-Bit Applications значение true. - person t3rse; 10.11.2011

Перейдите к IIS7 Application Pool -> advanced settings and set the 32-bit application to true.

person umar    schedule 27.11.2010
comment
Я использую Windows 7, и я столкнулся с этой проблемой; включение 32-разрядной версии исправило это для меня, по-видимому, потому, что моя копия DLL была 32-разрядной. - person Doug; 12.07.2011
comment
К вашему сведению: необходимо было установить идентификатор пула приложений на LocalSystem, чтобы это работало: ^ - person Illuminati; 15.07.2011
comment
И убедитесь, что у вас есть версия SQLite.Interop.dll для Win32 stackoverflow.com/questions/4816529/ - person Morten Holmgaard; 05.11.2013

Это очень просто, если вы не используете SQLite:

Вы можете удалить библиотеки DLL SQLite из папок bin вашего решения, а затем из папки, в которой вы ссылаетесь на ELMAH. Перестройте, и ваше приложение не будет пытаться загрузить эту DLL, которую вы не используете.

person Chris    schedule 27.09.2011
comment
+1 Если вы не используете SQLite, то зачем исправлять указанную DLL? Красиво, элегантно и именно то, что мне нужно. - person bhavinb; 06.12.2011
comment
Это работало локально, но после развертывания в Azure у меня возникла ошибка. - person stuartdotnet; 04.11.2014

У меня есть 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";
        }
person gatapia    schedule 10.05.2010
comment
Кто-нибудь успешно использовал эту технику? Я попробовал это в тестовом решении для приложения asp.net mvc, и у меня это не сработало. - person Glenn; 04.11.2010
comment
Вместо перехода к переменной среды вы можете напрямую использовать CLR: string arch = IntPtr.Size == 8? x64: x86; - person Jason Morse; 19.05.2011
comment
Или свойство Environment.Is64BitProcess (начиная с .NET4 ). - person riezebosch; 27.09.2011

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

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

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

А теперь вы можете использовать System.Data.SQLite.

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

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

Спасибо. Ким Тхо Фам, город Хошимин, Вьетнам. Почта: [email protected]

person Kim Thọ Phạm    schedule 30.12.2015

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

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

Мы его установили, и все работает нормально. В пуле приложений должно быть установлено значение «Включить 32-разрядные приложения», и вы должны использовать версию библиотеки x86.

person Marcos Meli    schedule 06.09.2012
comment
Работает для меня. Он просто выдает сообщение об ошибке, не указывая, что библиотека C отсутствует, что ужасно. - person kbridge4096; 03.10.2017
comment
Для меня я установил vcredist 2008 x64 для System.Data.SQLite, Version = 1.0.99.0, Culture = нейтральный, PublicKeyToken = db937bc2d44ff139 - person themadmax; 02.07.2018

Как человеку, которому приходилось иметь дело с довольно большим количеством отчетов об ошибках на Roadkill Wiki с точно такой же проблемой, вам нужно сделать следующее:

  • Вы используете x64 или x86? Sqlite поставляется с DLL для разных архитектур - скопируйте нужную в папку bin, для официального провайдера есть две DLL: System.Data.SQLite.dll System.Data.SQLite.Linq.dll
  • Если вас не беспокоит поиск этих сборок, включите 32-битный режим для вашего пула приложений (обычно это решение только для машин разработки)
  • Если вы размещаете на сервере, вам понадобится распространяемый компонент Microsoft C ++ Runtime - он не установлен на Server 2008 R2 по умолчанию. версия x64, версия x86

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

person Chris S    schedule 03.01.2013

Связанная с ручной загрузкой сборка 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";
    }
person lxwwqw    schedule 10.01.2011

Я получил эту ошибку, когда наш сервер Windows был преобразован с 32-битной ОС на 64-битную. Сборка, которая выдавала ошибку, была настроена на компиляцию в режиме x86 (то есть в режиме 32). Я переключил его на «Любой процессор», и это помогло. Вы можете изменить это значение, выполнив следующие действия:

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

person goku_da_master    schedule 10.12.2010
comment
Я пытался использовать 32-битный System.Data.SQLite.dll и получал это исключение при работе на 64-битном процессоре. Я изменил целевую платформу с Any CPU на x86, и исключение исчезло. Я полагаю, если вы не стремитесь максимизировать производительность, лучше строить с наименьшим общим знаменателем, чтобы он работал на 32- или 64-битном процессоре. - person cdavidyoung; 06.07.2012

Как ни странно, я решил эту проблему, установив System.Data.SQLite через приложение Nuget GUI, а не через консоль диспетчера пакетов.

Установка через консоль не включала зависимости, необходимые для запуска этой библиотеки.

person JMK    schedule 08.06.2015

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

Это старый вопрос, но я пробовал все вышеперечисленное. Я работал строго над проектом x86, поэтому не было двух папок / x86, / x64. Но по какой-то причине System.Data.SQLite была версией, отличной от System.Data.SQLite.interop, как только я вытащил соответствующие DLL, проблема была решена.

person Stacker-flow    schedule 13.04.2016

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

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

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

person Anon    schedule 01.09.2011

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

person Peter Bernier    schedule 27.06.2012

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

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

person Graviton    schedule 14.08.2009
comment
Я попытался добавить ссылку на System.Data.SQLite напрямую (помимо удаления bin и obj), и у меня есть эта ошибка: Ошибка 1 Предупреждение как ошибка: Генерация сборки - Ссылочная сборка 'System.Data.SQLite.dll 'нацелен на другой процессор MyProject - person pupeno; 15.08.2009

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

person cyclo_magic    schedule 04.02.2015

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

person MichaelD    schedule 08.06.2018

Вероятно, у вас установлен не тот пакет. Вам нужен пакет, созданный Microsoft, который реализует System.Data.Common модель провайдера.

person pim    schedule 30.08.2018