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

109

Я установил 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 'или одной из его зависимостей. Попытка было сделано для загрузки программы с помощью неправильный формат.

Подробные сведения об ошибках внизу.

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

Я пробовал компиляцию для 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.InternalLoad(AssemblyName assemblyRef, Доказательства assemblySecurity, StackCrawlMark & stackMark, Boolean forIntrospection) +127 System.Reflection.Assembly.InternalLoad(String assemblyString, Доказательство assemblySecurity, StackCrawlMark & stackMark, Boolean forIntrospection) +142 System.Reflection.Assembly.Load(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.Configuration.CompilationSection.LoadAssembly(AssemblyInfo ai) +105
System.Web.Compilation.BuildManager.GetReferencedAssemblies(CompilationSection compConfig) +178
System.Web.Compilation.BuildProvidersCompiler..ctor(VirtualPath configPath, Boolean supportLocalization, String outputAssemblyName) +54
System.Web.Compilation.ApplicationBuildProvider.GetGlobalAsaxBuildResult(Boolean isPrecompiledApp) +232
System.Web.Compilation.BuildManager.CompileGlobalAsax() +52 System.Web.Compilation.BuildManager.EnsureTopLevelFilesCompiled() +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
System.Web.HttpRuntime.ProcessRequestInternal(HttpWorkerRequest wr) +259

  • 0
    Журнал Fusion (привязка сборки) гораздо более полезен в таких случаях, чем этот лист трассировки стека.
  • 1
    Кажется, проблема была в том, что Cassini - это x86.
Показать ещё 1 комментарий
Теги:
elmah

16 ответов

107
Лучший ответ

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

Обновление (любезно предоставлено J. Pablo Fernandez): Cassini, веб-сервер разработки, используемый Visual Studio при нажатии F5 или нажатии зеленой кнопки "play", является только x86, что означает, что даже если ваша рабочая станция - x64, вы сможете использовать только x86-версию System.Data.SQLite.dll.

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

  • 3
    Я использую версию x64 на компьютере x64.
  • 0
    Вы пытались использовать версию x86?
Показать ещё 5 комментариев
75

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

  • 2
    Это работает, если вы хотите использовать x86 dll на 64-битной машине. В нашем случае, наши разработки и производственная среда не совпадают, поэтому это было лучше всего.
  • 16
    Установка этого значения для меня на самом деле решила проблему. Я думаю, что Elmah поставляется с 32-битной сборкой SQL по умолчанию.
Показать ещё 1 комментарий
41

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

  • 0
    Я использую Windows 7 и столкнулся с этой проблемой. исправление 32-битного режима исправило это для меня, по-видимому, потому что моя копия DLL была 32-битной.
  • 1
    К вашему сведению: необходимо было установить удостоверение пула приложений на LocalSystem, чтобы это работало: ^
Показать ещё 1 комментарий
10

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

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

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

У меня есть 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";
        }
  • 0
    Кто-нибудь успешно использовал эту технику? Я попробовал это в тестовом приложении asp.net mvc, и у меня это не сработало.
  • 1
    Вместо перехода к переменной среды вы можете использовать CLR напрямую: string arch = IntPtr.Size == 8? "x64": "x86";
Показать ещё 1 комментарий
4

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

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

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

3

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

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

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

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

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

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

Спасибо. Ким Тхо Фам, HoChiMinh City, Вьетнам. Электронная почта: [email protected]

  • 0
    Спасибо, что поделились
3

Ручная сборка 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";
    }
3

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

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

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

Я решил это, как ни странно, установкой System.Data.SQLite через приложение Nuget GUI, в отличие от консоли диспетчера пакетов.

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

2

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

Распространяемый пакет Microsoft Visual С++ 2010 с пакетом обновления 1 (x86)

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

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

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

1

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

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

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

0

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

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

0

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

0

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню