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

126

Я установил 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. .nLoad (AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark и stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection) +43
System.Reflection.Assembly.InternalLoad (AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark и stackMark, Boolean дляIntrospection) +127 System.Reflection.Assembly.InternalLoad (String assemblyString, Evidence assemblySecurity, StackCrawlMark & ​​stackMark). Загрузить (String assemblyString) +28
System.Web.Configuration.CompilationSection.LoadAssemblyHelper (String assemblyName, Boolean starDirective) +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. .CompilationSection.LoadAssembly (AssemblyInfo ai) +105
System.Web.Compilation.BuildManager.GetReferencedAssemblies (CompilationSection compConfig) +178
System.Web.Compilation.BuildProvidersCompiler..ctor (VirtualPath configPath, Boolean supportLocalizationName, String) вывод +
System.Web.Compilation.ApplicationBuildProvider.GetGlobalAsaxBuildResult (Boolean isPrecompiledApp) +232
System.Web.Compilation.BuildManager.CompileGlobalAsax () +52 System.Web.Compilation.BuildManager.EnsureTopLevel () +337Compiled

[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
System.Web.HttpRuntime.ProcessRequestInit (HttpRuntime.ProcessRequestInit ) +259

pupeno
источник
Журнал Fusion (привязка сборки) намного полезнее в таких случаях, чем этот лист трассировки стека.
Антон Тихий
1
Похоже, проблема была в том, что Cassini - это x86.
pupeno
У меня была такая же проблема, и мне пришлось отказаться от ELMAH из-за смешанной среды производства и разработки. Учитывая, что использование SQLite на производственном веб-сервере с высоким трафиком звучит не очень хорошо, а также тот факт, что SQLite dll - единственная сборка в ELMAH, которая заставляет его иметь две разные версии для бит x86 и 64x, мне интересно, почему ребята из ELMAH тянут и сделайте его необязательным, а не тем, что есть сейчас.
Khash

Ответы:

122

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

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

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

Антон Тихий
источник
3
Я использую версию x64 на компьютере x64.
pupeno
Вы пробовали использовать версию x86?
Антон Тихий
2
Новая альтернатива, которая стала доступной незадолго до этого, - это использование IIS Express, который позволяет вам установить тип пула приложений, который вы хотите использовать
Рауль Вехар,
@Raul Vejar: расскажите, пожалуйста, о том, как функция выбора пула приложений в IIS Express решает проблему 32-битной / 64-битной сборки. Спасибо
Тим
@Tim, эта функция позволяет вам выбрать тип пула приложений, который вы хотите использовать, 32 или 64 бит, таким образом вы можете контролировать этот аспект, который был исправлен в Cassini, и работать с той же битовой библиотекой, которая у вас есть. Другими словами, если вы используете 32-разрядную версию библиотеки DLL SQLite, вам следует выбрать 32-разрядный пул приложений в IIS Express. Для 64-битной версии библиотеки следует выбрать 64-битный пул приложений.
Рауль Вехар 07
77

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

beckelmw
источник
2
Это работает, если вы хотите использовать dll x86 на 64-битной машине. В нашем случае наша среда разработки и производственная среда не совпадают, поэтому это сработало лучше всего.
Роб
17
Установка для меня значения true фактически решила проблему. Думаю, Elmah по умолчанию поставляется с 32-битной сборкой sql lite.
1
+1 для @Jirapong и Сергея, потому что именно этим параметром мне пришлось манипулировать, чтобы все заработало. В моем случае я думаю, что у меня была x86-версия библиотеки SqlLite, и мне нужно, чтобы для параметра Enable 32 - Bit Applications было установлено значение «true».
t3rse
43

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

Умар
источник
Я использую Windows 7, и я столкнулся с этой проблемой; включение 32-разрядной версии исправило это для меня, по-видимому, потому, что моя копия DLL была 32-разрядной.
Дуг
1
К вашему сведению: требовалось установить идентификатор пула приложений на LocalSystem, чтобы это работало: ^
Illuminati
И убедитесь, что у вас есть версия SQLite.Interop.dll для Win32 stackoverflow.com/questions/4816529/…
Мортен Холмгаард
14

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

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

Крис
источник
5
+1 Если вы не используете SQLite, то зачем исправлять указанную DLL? Красиво, элегантно и именно то, что мне нужно.
bhavinb 06
Это сработало локально, но после развертывания в Azure я получил ошибку.
stuartdotnet
8

У меня есть 64-битная машина для разработки и 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";
        }
gatapia
источник
Кто-нибудь успешно использовал эту технику? Я попробовал это в тестовом решении для приложения asp.net mvc, и у меня это не сработало.
Glenn
1
Вместо перехода к переменной среды вы можете напрямую использовать CLR: string arch = IntPtr.Size == 8? «x64»: «x86»;
Джейсон Морс
2
Или свойство Environment.Is64BitProcess (начиная с .NET4).
riezebosch
5

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

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

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

Маркос Мели
источник
1
Работает для меня. Он просто выдает сообщение об ошибке, не указывая, что библиотека C отсутствует, что ужасно.
brk
1
Для меня я установил vcredist 2008 x64 для System.Data.SQLite, Version = 1.0.99.0, Culture = нейтральный, PublicKeyToken = db937bc2d44ff139
themadmax 02
5

Как человеку, которому приходилось иметь дело с довольно большим количеством отчетов об ошибках на 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 ++.

Крис С
источник
5

Я решил это, установив 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 и установите действие сборки - это содержимое, а Копировать в выходной каталог - всегда копировать.

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

Спасибо. Ким Тхо Фам, Хошимин, Вьетнам. Почта: tho.phamkim@gmail.com

Ким Тхо Фум
источник
4

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

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

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

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

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

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

JMK
источник
3

System.Data.SQLiteимеет зависимость от System.Data.SQLite.interopтого, чтобы оба пакета были одной и той же версии и оба были x86 .

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

Укладчик-поток
источник
1

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

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

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

скоро
источник
1

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

Питер Бернье
источник
0

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

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

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

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

cyclo_magic
источник
0

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

MichaelD
источник
0

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

pimbrouwers
источник