Не вдалося завантажити файл або збірку "System.Data.SQLite"


126

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

Не вдалося завантажити файл або збірку 'System.Data.SQLite, Версія = 1.0.61.0, Культура = нейтральна, PublicKeyToken = db937bc2d44ff139' або одна з її залежностей. Була зроблена спроба завантажити програму з неправильним форматом.

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

Деталі винятків: System.BadImageFormatException: Не вдалося завантажити файл або збірку 'System.Data.SQLite, Версія = 1.0.61.0, Культура = нейтральна, PublicKeyToken = db937bc2d44ff139' або одна з її залежностей. Була зроблена спроба завантажити програму з неправильним форматом.

Детальніше про помилки внизу.

Моя платформа Active Solution - «Будь-який процесор», і я працюю на x64 Windows 7 на x64, звичайно, процесор. Причина, по якій ми використовуємо цю версію ELMAH, полягає в тому, що 1.0 .Net 3.5 (x86, яка є єдиною платформою, для якої вона компілюється) дав нам таку саму помилку на нашому сервері Windows x64.

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

Помилка 1 Попередження як помилка: генерація збірки - посилання на збірку 'System.Data.SQLite.dll' націлена на інший процесор MyProject

Якась проблема може бути проблемою?

Детальніше про помилки:

Помилка джерела:

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

Слід стека:

[BadImageFormatException: Не вдалося завантажити файл або збірку 'System.Data.SQLite, Версія = 1.0.61.0, Культура = нейтральна, PublicKeyToken = db937bc2d44ff139' або одна з її залежностей. Була зроблена спроба завантажити програму, що має невірний формат.]
System.Reflection.Assembly._nLoad (AssemblyName имя_файла, String CodeBase, Evidence assemblySecurity, Асамблея locationHint, StackCrawlMark & stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection) +0
System.Reflection.Assembly .nLoad (fileName fileName, String codeBase, Свідчення доказів Безпека, Місце складанняHint, StackCrawlMark & ​​stackMark, Boolean bacOnFileNotFound, Boolean forIntrospection) +43
System.Reflection.Assembly.InternalLoad (AssemblyName assemblyRef, фактичні дані assemblySecurity, StackCrawlMark & stackMark, булева forIntrospection) +127 System.Reflection.Assembly.InternalLoad (String assemblyString, фактичні дані assemblySecurity, StackCrawlMark & stackMark, булева forIntrospection) +142 System.Reflection.Assembly. Завантаження (String AssemblyString) +28
System.Web.Configuration.CompilationSection.LoadAssemblyHelper (String AssemblyName, Boolean starDirective) +46

[ConfigurationErrorsException: Не вдалося завантажити файл або збірку 'System.Data.SQLite, Версія = 1.0.61.0, Культура = нейтральна, PublicKeyToken = db937bc2d44ff139' або одна з її залежностей. Була зроблена спроба завантажити програму з неправильним форматом.]
System.Web.Configuration.CompilationSection.LoadAssemblyHelper (String AssemblyName, Boolean starDirective) +613 System.Web.Configuration.CompilationSection.LoadAllAssembliesFinAireon (Information) (Information) .CompilationSection.LoadAssembly (AssemblyInfo ai) +105
System.Web.Compilation.BuildManager.GetReferencedAssemblies (CompilationSection compConfig) +178
System.Web.Compilation.BuildProvidersCompiler..ctor (Підтримка VirtualPathPan, StringPamese, Path)
System.Web.Compilation.ApplicationBuildProvider.GetGlobalAsaxBuildResult (Булева вигодаPrecompiledApp) +232
System.Web.Compilation.BuildManager.CompileGlobalAsax () +52 System.Web.Compilation.BuildTepilesMeilMaoperMapilPailType

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

[HttpException (0x80004005): не вдалося завантажити файл чи збірку 'System.Data.SQLite, версія = 1.0.61.0, культура = нейтральна, PublicKeyToken = db937bc2d44ff139' або одна з її залежностей. Була зроблена спроба завантажити програму з невірним форматом.]
System.Web.HttpRuntime.FirstRequestInit (контекст HttpContext) +8896783
System.Web.HttpRuntime.EnsureFirstRequestInit (контекст HttpContext) +85
System.Web.HttpRtcessWestquest WTP ) +259


Журнал Fusion (прив'язка для складання) набагато корисніший у таких випадках, ніж цей аркуш сліду стека.
Антон Тихий

1
Здається, проблема була в тому, що Кассіні - це x86.
pupeno

У мене виникло те саме питання, і мені довелося відмовитися від ELMAH через змішане середовище виробництва / розвитку. Враховуючи, що використання SQLite на веб-сервері з високим трафіком не дуже добре, і той факт, що dQL SQLite є єдиною в ELMAH, що змушує його мати дві різні версії для x86 і 64x біт, мені цікаво, чому хлопці ELMAH тягнуть це зробити і зробити його необов’язковим, а не тим, що є зараз.
Хаш

Відповіді:


122

System.Data.SQLite.dllє змішаною збіркою, тобто містить як керований код, так і нативний код. Тому конкретний System.Data.SQLite.dllабо x86, або x64, але ніколи і те й інше.

Оновлення ( люб’язно Дж. Пабло Фернандес ): Кассіні, веб-сервер розробки, який використовується 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-бітний пул додатків.
Рауль Вежар

77

Переконайтеся, що для пулу додатків "Увімкнути 32 - бітові програми" встановлено значення "false".


2
Це працює, якщо ви хочете використовувати x86 dll на 64-бітній машині. У нашому випадку наше виробництво та виробниче середовище не збігаються, тому саме це працювало найкраще.
Роб

17
Встановивши це як істинне для мене, фактично вирішено питання. Я думаю, що Elmah поставляється за замовчуванням 32-бітну sql lite збірку.

1
+1 і для @Jirapong, і для Сергія, оскільки саме з цією настройкою мені довелося маніпулювати, щоб працювати. У моєму випадку я думаю, що у мене була версія x86 DLL для SqlLite і мені було потрібно, щоб для 32-бітових додатків Enable було встановлено значення "true".
t3rse

43

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


У мене працює Windows 7, і я торкнувся цього питання; увімкнувши 32-розрядну фіксовану функцію для мене, імовірно, тому, що моя копія DLL була 32-розрядною.
Дуг

1
FYI: Потрібно було встановити ідентифікацію пулу додатків у LocalSystem, щоб це працювало: ^
Illuminati

І переконайтеся , що є версія Win32 в SQLite.Interop.dll stackoverflow.com/questions/4816529 / ...
Morten Holmgaard

14

Це дуже просто, якщо ви не використовуєте SQLite:

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


5
+1 Якщо ви не використовуєте SQLite, то навіщо турбуватися виправляти посилання DLL? Приємно, елегантно і саме те, що мені було потрібно.
bhavinb

Це працювало локально, але потім я отримав помилку після розгортання в Azure.
stuartdotnet

8

У мене є 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";
        }

Хтось успішно використовував цю техніку? Я спробував це в тестовому рішенні програми asp.net mvc, і це не працювало для мене.
Гленн

1
Замість переходу до змінної середовища, ви можете використовувати CLR безпосередньо: string arch = IntPtr.Size == 8? "x64": "x86";
Джейсон Морз

2
Або властивість Environment.Is64BitProcess (з .NET4).
riezebosch

5

У нашому випадку не вийшло, оскільки наш сервер виробництва відсутній

Перерозподільний пакет Microsoft Visual C ++ 2010 SP1 (x86)

Ми його встановили, і все працює добре. У пулі додатків повинно бути встановлено значення "Увімкнутий 32-бітний додаток", і ви повинні мати версію x86 бібліотеки


1
Працює для мене. Це просто дає повідомлення про помилку, не вказуючи на відсутність бібліотеки С, що жахливо.
брк

1
Для мене я встановив vcredist 2008 x64 для System.Data.SQLite, версія = 1.0.99.0, культура = нейтральний, PublicKeyToken = db937bc2d44ff139
themadmax

5

Оскільки вам довелося зіткнутися з численними повідомленнями про помилки на Roadkill Wiki з точно такою ж проблемою, ось що вам потрібно зробити:

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

Це справжній біль у дупі, скільки обручів вам доведеться перестрибувати при повторному розповсюдженні бінарних файлів SQL .NET. Моє рішення для Roadkill врешті-решт було скопіювати правильні бінарні файли в папку ~ / bin на основі архітектури, яку ви використовуєте . На жаль, це не вирішує проблему виконання C ++.


5

Я вирішив це, встановивши System.Data.SQLite з розширенням Nuget. Це розширення можна використовувати для Visual Studio 2010 або новішої версії. По-перше, ви повинні встановити розширення Nuget. Ви можете слідувати тут:

  • Перейдіть у Visual Studio 2010, меню -> Інструменти
  • Виберіть Диспетчер розширень
  • Введіть NuGet у поле пошуку та натисніть Інтернет-галерея. Зачекайте Отримайте інформацію…
  • Виберіть отриманий менеджер пакунків NuGet і натисніть Завантажити. Чекаємо на завантаження…
  • Натисніть «Встановити» в диспетчері пакунків NuGet програми встановлення Visual Studio. Дочекайтеся завершення установки.
  • Клацніть Закрити та 'Перезавантажте зараз.

По-друге, тепер ви можете встановити SQLite:

А тепер ви можете використовувати System.Data.SQLite.

У випадку ви бачите дві папки x64 і x86, ці папки містять SQLite.Interop.dll. Тепер перейдіть до вікна властивостей цих dll і встановіть, що дія збірки є вмістом, а каталог Copy to output - Copy always.

Отже, це мій шлях.

Дякую. Кім Тхо Фам, місто Хочімінь, В'єтнам. Електронна пошта: 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";
    }

4

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

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


1
Я намагався використовувати 32-бітний System.Data.SQLite.dll і отримував це виключення під час роботи на 64-бітному процесорі. Я змінив ціль платформи з "Будь-який процесор" на "x86", і це зробило виняток. Я думаю, якщо ви не хочете досягти максимальної продуктивності, краще побудувати для найменшого спільного знаменника, щоб він працював або на 32, або на 64-бітному процесорі.
cdavidyoung

3

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

Встановлення через консоль не включало залежності, якими повинна працювати бібліотека.


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 в каталозі бін проекту. Я роблю каталог dll, щоб помістити його.



0

Чи можете ви видалити папку налагодження у сміттєвому коді та перекомпілювати знову?

Або перевірте посилання свого проекту на System.Data.SQLite, відстежте, де він знаходиться, а потім відкрийте dll у відбивачі. Якщо ви не можете його відкрити, це означає, що dll пошкоджений, можливо, ви захочете знайти правильний або перевстановити .net Framework.


Я намагався безпосередньо додати посилання на System.Data.SQLite (окрім видалення біна та obj), і я отримав цю помилку: помилка 1 Попередження як помилка: генерація збірки - посилання на збірку 'System.Data.SQLite.dll 'націлений на інший процесор MyProject
pupeno

0

Якщо ви використовуєте IIS Express як веб-сервер на вашій машині розробки, я перейду на Local IIS. Це працювало для мене.


0

Це стара публікація, але це може допомогти деяким людям, які шукають цю помилку, спробувати встановити "Увімкнути 32-бітні програми" на "Істинно" для пулу програм. Саме це і вирішило для мене помилку. Я підійшов до цього рішення, прочитавши деякі коментарі до відповіді @ beckelmw.


0

Ймовірно, встановлено неправильний пакет. Ви хочете, щоб пакет, виготовлений Microsoft, реалізував модель постачальника System.Data.Common.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.