Неможливо завантажити DLL 'SQLite.Interop.dll'


205

Періодично я отримую таке виняток:

Unable to load DLL 'SQLite.Interop.dll': The specified module could not be found. (Exception from HRESULT: 0x8007007E)

Я використовую 1.0.82.0. версія, встановивши його з nuget у VS2010, OS Win7 64.

Як тільки виняток починає з'являтися, він з’являється постійно - у налагодженні та випуску та запуску програми всередині або поза VS.

Єдиний спосіб зупинити це - вихід із системи та вихід із системи. Виняток не кидається і dll завантажується. Він може працювати цілими днями, але потім може зламатися знову.

Хтось бачив щось подібне і чи є для цього рішення?


2
Так, копіюється завжди. У мене папки x64 та x86 у bin / debug. І це працює в основному, але іноді просто перестає працювати. Можливо, щось блокує доступ до dll, я спробую це дізнатись наступного разу, коли він перестане працювати. Як я вже сказав, це може працювати без днів без проблем.
xll

13
Цю помилку я отримав прямо з коробки після додавання нульового пакета SQLite до нового проекту консолі. Копіювання SQLite.Interop.dll вручну з папки x86 на один рівень дозволяє програмі запускатися. Мені здається дивним, що це було б так зламано.
менше коду

@Wayne Так, це безумовно допомагає. Але в моєму випадку ми працюємо разом над проектом, і мій друг використовує x86, а я x64 OS. І як я помітила, іноді просто зупиняється на роботі. Хоча це не сталося зі мною минулого місяця.
xll

1
Якщо ви завантажите правильний бінарний файл для SQLite, скопіюйте SQLite.Interop.dll у папку Release or Debug відповідно до варіанту створення проекту.
Ельшан

Це така випадкова помилка ... іноді вона трапляється, а іноді не відповідає моєму проекту. Перепробував усе.
БК

Відповіді:


140

Я знаю, що я запізнююся на вечірку, але у мене виникло це питання відразу після того, як я зняв останню версію x86 / x64 сьогодні (версія 1.0.88.0). Мій локальний IIS в VS2012 за замовчуванням працює 32-бітний, і немає простого способу переходу на x64. Мій виробничий сервер працює на 64 бітах.

У будь-якому випадку я встановив пакет NuGet для проекту DLL, і я отримав цю помилку. Що мені довелося зробити, щоб він працював, мені довелося встановити його і на проект основного сайту . Навіть якщо він взагалі не торкається класів SQLite.

Я здогадуюсь, що SQLite використовує збірку записів для виявлення, яку версію Interop завантажити.


11
Це працювало для мене після того, як я додав посилання на SQLite Core з NuGet до основного проекту.
Лука Кремонесі

Додавання sqllite.core до основного проекту працювало на мене над моїм рішенням WPF
Dipu Raj

Мені довелося робити як інсталяційний пакет Sqlite, так і Install-Package System.Data.SQLite.Core на свій веб-сайт, навіть якщо дзвінки db знаходяться в бібліотеці ...

Це має бути відповіддю.
Боббі Туркаліно

4
Що ви розумієте під проектом "основний сайт"? У моєму випадку я роблю настільні роботи. Ви маєте на увазі проект "стартап"?
UuDdLrLrSs

60

У мене була ця проблема, оскільки у dll, який я використовував, був Sqlite як залежність (налаштований у NuGet тільки з базовим пакетом Sqlite.). Проект компілює та копіює всі dll-файли Sqlite, крім 'SQLite.Interop.dll' (як папки x86, так і x64).

Рішення було дуже простим: просто додайте пакет Sqlite.Core як залежність (з NuGet) до проекту, який ви будуєте / виконуєте, і dll-s будуть скопійовані.


Працювали для мене! Спасибі
Трістан Джахель

Домовились. Я використовую пакет "Sqlite.Net PCL", але виявив, що мені також потрібен "System.Data.SQLite Core (x86 / x64)". Я також повинен був змінити проект (і), посилаючись на нього, щоб використовувати ціль платформи "x86" або "x64", а не "Будь-який процесор".
Ендрю Стівенс

2
Перепробував досить багато рішень, розміщених тут, цей справді вийшов найкращим.
Бетмен

2
Як можна додати таку залежність? ніколи не робив цього (VS2013)
jpgrassi

3
Перейдіть до Інструменти -> Менеджер пакунків NuGet -> Керування пакетами NuGet для рішення ... -> Інтернет -> Усі. Потім знайдіть sqlite та додайте Core.Data.SQLite Core (x86 / x64).
Марин

44

У мене була така ж проблема, коли я використовував SQLite в проекті WPF, метою якого була платформа Any CPU. Я виправив це, виконавши наступні кроки:

  1. Відкрийте дизайнера проекту у Visual Studio. Детальніше про те, як це зробити, ви можете прочитати тут .
  2. Перейдіть на вкладку Build.
  3. Вимкнути prefer 32-bitопцію.

Крім того, ви можете просто встановити ціль платформи на x86або x64. Я думаю, що ця проблема викликана тим, що System.Data.SQLiteбібліотека використовує ціль платформи, щоб отримати розташування файлу 'SQLite.Interop.dll'.

ОНОВЛЕННЯ:

Якщо дизайнер проекту не може бути досягнутий, просто відкрийте *.csprojфайл project ( ) у текстовому редакторі та додайте значення <Prefer32Bit>false</Prefer32Bit>в <PropertyGroup>...</PropertyGroup>тег.

Приклад коду

<PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <ProjectGuid>[Set by Visual Studio]</ProjectGuid>
    <OutputType>Exe</OutputType>
    <AppDesignerFolder>Properties</AppDesignerFolder>
    <RootNamespace>[Set by Visual Studio]</RootNamespace>
    <AssemblyName>[Set by Visual Studio]</AssemblyName>
    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
    <FileAlignment>[Set by Visual Studio]</FileAlignment>
    <!--Add the line below to your project file. Leave everything else untouched-->
    <Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>

Я використовую VS 2010, такого варіанту немає.
xll

@xll, я відредагував відповідь для уточнення. Перевірте, чи редагування очищує речі.
Caleb Kiage

10
У VS2012 цей варіант для мене є сірим.
Кугель

6
Цей параметр увімкнено лише для проектів EXE, але я думаю, що більшість із нас має це питання з тестовими проектами.
Браннон

1
Мене було сірим у проекті WPF у програмі VS Pro 2015. .csprojФайл уже був встановлений false, але помилка все ще була.
vapcguy

32

Ось як я це зафіксував у своєму проекті.

Це працювало, і коли колега представив свої зміни, я отримав виняток "Не вдається завантажити DLL" SQLite.Interop.dll "".

Розрізняючи файл .csproj проекту, це було у версії НЕ ПРАЦЮЄМО:

<ItemGroup>
     <Content Include="x64\SQLite.Interop.dll" />
     <Content Include="x86\SQLite.Interop.dll" />
</ItemGroup>

І це те, що РОБОЧА версія мала:

<ItemGroup>
     <Content Include="x64\SQLite.Interop.dll">
          <CopyToOutputDirectory>Always</CopyToOutputDirectory>
      </Content>
      <Content Include="x86\SQLite.Interop.dll">
          <CopyToOutputDirectory>Always</CopyToOutputDirectory>
      </Content>
</ItemGroup>

Після повернення назад я не отримав винятку. Файли DLL були скинуті у відповідні папки Debug \ x64 (тощо).


<itemgroup> для "SQLite.Interop.dll" немає у файлі .csproj проекту. все ж я намагався додати ваше рішення, але не вийшло :(
ayc

У VS2012 це не працюватиме, елементів не існує.
htm11h

Велике спасибі. Працює у 2015 році проти
Євгеній Кононов

29

Отже, після додавання NuGet розгортання не копіює Interops. Ви можете додати це у файл csproj, і він повинен виправити таку поведінку:

 <PropertyGroup> 
    <ContentSQLiteInteropFiles>true</ContentSQLiteInteropFiles>
    <CopySQLiteInteropFiles>false</CopySQLiteInteropFiles>
    <CleanSQLiteInteropFiles>false</CleanSQLiteInteropFiles>
    <CollectSQLiteInteropFiles>false</CollectSQLiteInteropFiles>
 </PropertyGroup>

Якщо ви подивитесь у джерело NuGet для SQLite, ви можете побачити, що саме вони роблять. Це дозволило мені отримати розгортання в роботі з ASP.Net Core.


10
ContentSQLiteInteropFiles - це відповідь. Більшість найкращих відповідей - здогадки.
Корі Алікс

6
Так, ContentSQLiteInteropFiles - це відповідь. 1. Це повинна бути прийнята відповідь.
Герлейм

Повинна бути прийнята відповідь. Супер просто. 1. вивантажте проект 2. додайте вище в csproj 3. перезавантажте проект. це так просто ...
BillRuhl

24

Коли ви перебуваєте в такому стані, спробуйте виконати Rebuild-All. Якщо це усуне проблему, у вас може виникнути та сама проблема, що і у мене.

Деякі передумови (як я розумію) :

  • SQLite має 1 керовану збірку (System.Data.SQLite.dll) та декілька конкретних платформних зборок (SQLite.Interop.dll). Встановлюючи SQLite за допомогою Nuget, Nuget додасть конкретні збірки платформи до вашого проекту (в межах декількох папок: \ x86, \ x64) та конфігурує ці файли на "Копіювати завжди".

  • Після завантаження керована збірка здійснюватиме пошук конкретних платформних збірок всередині папок \ x86 та \ x64. Більше про це можна побачити тут . Виняток - це керована збірка, що намагається знайти відповідне (SQLite.Interop.dll) всередині цих папок (і невдало).

Мій сценарій :

У мене є 2 проекти у своєму рішенні; додаток WPF та бібліотека класів. Додаток WPF посилається на бібліотеку класів, а бібліотека класів посилається на SQLite (встановлений через Nuget).

Проблема для мене полягала в тому, що коли я змінюю лише додаток WPF, VS намагається зробити часткове відновлення (розуміючи, що залежний dll не змінився). Десь у цьому процесі VS очищає вміст папок \ x86 та \ x64 (здуває SQLite.Interop.dll). Коли я роблю повну Rebuild-All, VS копіює папки та їх вміст правильно.

Моє рішення :

Щоб виправити це, я закінчив додавати процес Post-Build за допомогою xcopy, щоб примусити копіювати папки \ x86 та \ x64 з бібліотеки класів до мого каталогу файлів WPF \ bin.

Крім того, ви можете робити більш химерні речі за допомогою конфігурації / виведення каталогів.


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

1
Моїм майже однаковим рішенням було додати папки x86 та x64 до мого запуску проекту, а потім додати файли interop x86 та x64 interop у відповідні папки. Я встановив опцію файлів на "вміст" та "завжди будувати". Це єдиний спосіб, коли я можу отримати свій додаток Windows Forms для підключення до вбудованого файлу бази даних s3db, коли я розгортав додаток із ClickOnce на інших ПК. Розчарування, у мене не було помилки SQLite, коли я розробляв і тестував додаток на своєму ПК.
Девід Алан Кондіт

Все ще відбувається з VS 2017: '(
wmebane

1
Це відповідь, яка допомагає мені зрозуміти свою проблему, хоча моє виправлення дещо інше. Моя проблема полягає в тому, що я додав system.data.Sqlite.dll вручну. Таким чином Sqlite.Interop.dll не копіюється автоматично в \ x86 та x64. Виправлення полягає в тому, щоб видалити посилання та додати її Nuget.
Сьюзан Ван

19

У мене був той самий випуск, що працює під управлінням Visual Studio Express 2013. Я спробував кілька рішень, згаданих тут і в інших місцях, безрезультатно. Я сподіваюся, що це виправлення допоможе іншим.

Я виправив це за допомогою DeploymentItemатрибута мого тестового класу, який тестує службу на базі SQLite.

Приклад:

[TestClass]
[DeploymentItem(@"x86\SQLite.Interop.dll", "x86")] // this is the key
public class LocalStoreServiceTests
{

    [TestMethod]
    public void SomeTestThatWasFailing_DueToThisVeryIssue()
    {
         // ... test code here
    }
}

Це призводить до необхідності SQLite.Interop.dllкопіювання в x86каталог у відповідній папці "TestResults".

Все зелене. Все добре.


1
Це рішення працює лише у тому випадку, якщо ви використовуєте простір імен Microsoft.VisualStudio.TestTools.UnitTesting
sapbucket

4
Це правильне рішення, якщо ви використовуєте MSTest. SQLite відмінно працював, знаходячи SQLite.Interop.dll без жодних проблем, поки я не використав DeploymentItem ("some.csv") для тесту. Включення файлу .csv таким чином викликало MSTest для копіювання всіх посилань на dll до каталогу TestResults. Оскільки SQLite.Interop.dll не посилається на проект (і не може бути, оскільки це некерований код), він ніколи не копіювався.
Йоганн

Ваша найкраща ставка - додати два рядки, по одному для кожної архітектури. Це захищає вас у випадку, якщо тестовий бігун працює 64-розрядним.
Кірк Волл

13

Оновлення NuGet з Tools -> Extension and updatesта перевстановлення SQLite.Core за допомогою команди PM> Update-Package -reinstall System.Data.SQLite.Coreвиправили це для мене.


Якщо ви отримаєте помилку під час цього, видалення моїх DLL-файлів / посилань SQLite та повністю перевстановлення їх з nuget зробило для мене трюк
KayakinKoder

перевстановити ядро ​​sqllite допоможе і мені. Виник у VS2012. VS не включала версію x62 до пакету веб-розгортання
Андрій R

Виправлено і для VS2015 Professional.
Рахул Кішор

9

У мене було подібне питання у вирішенні кількох проектів. SQLite.Interop.dll був необхідний для одного з плагінів, що поширюються разом із програмним забезпеченням за допомогою ClickOnce.

Що стосується налагодження у візуальній студії, все працювало нормально, але у розгорнутій версії бракувало папок x86 / та x64 /, що містять цю DLL.

Рішенням його роботи після розгортання за допомогою ClickOnce було створення в проекті запуску рішення (також тієї, що публікується) цих двох підпапок, копіювання в них DLL-файлів і встановлення їх як завжди копіювати вміст.

Таким чином інструмент публікації ClickOnce автоматично включає ці файли та папки в маніфест і розгортає програмне забезпечення з ними


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

8

Тут дійсно багато відповідей, але моя проста і зрозуміла, без ігор GAC .

Проблема полягала в тому, що виконуваному файлу потрібна копія права SQLite.Interop.dll(x86 або x64) для доступу до нашої Бази даних.

Переважно архітектури мають шари, і в моєму випадку для рівня даних даних потрібна DLL для з'єднання SQLite.

Тому я просто вклав сценарій створення повідомлення в моє рішення для рівня даних і все працювало чудово.


TL; DR;

  1. Встановіть усі проекти свого рішення на x86або x64в параметрах збірки.

  2. Додайте Post-Build-Scriptдо Проекту наступне SQLite nuget Package:

    xcopy "$(TargetDir)x64" "$(SolutionDir)bin\Debug\" /y

Звичайно, ви повинні змінити сценарій Release Buildі x86будувати.


STL; DR;

Поставте SQLite.Interop.dllнаступне до *.exeФайлу.


6

Установка за замовчуванням версії SQLite для багатьох архітектур (x86, x64) від NuGet демонструє описану вами поведінку. Якщо ви хочете завантажити правильну версію для фактичної архітектури, яку час виконання .NET вирішив запустити вашу програму на вашій машині, тоді ви можете дати навантажувачу DLL підказку про те, де знайти правильну бібліотеку наступним чином:

Додайте декларацію для виклику функції kernel32.dll до SetDLLDirectory () перед вашим Program.Main ():

    [System.Runtime.InteropServices.DllImport("kernel32.dll", CharSet = System.Runtime.InteropServices.CharSet.Unicode, SetLastError = true)]
    [return: System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.Bool)]
    static extern bool SetDllDirectory(string lpPathName);

Потім використовуйте власний метод визначення правильного підкаталогу, щоб знайти специфічну для архітектури версію 'SQLite.Interop.dll'. Я використовую такий код:

    [STAThread]
    static void Main()
    {
        int wsize = IntPtr.Size;
        string libdir = (wsize == 4)?"x86":"x64";
        string appPath = System.IO.Path.GetDirectoryName(Application.ExecutablePath);
        SetDllDirectory(System.IO.Path.Combine(appPath, libdir));

4

навіть якщо це старий пост, я хотів би поділитися рішенням, яке я знайшов тут: http://system.data.sqlite.org/index.html/info/54e52d4c6f

Якщо ви не хочете читати всю проблему, рішенням є скопіювати файл "msvcr100.dll" (який можна знайти в каталозі Windows \ System32) тим же шляхом, що і SQLite.Interop.dll.

Я радив би прочитати проблему, щоб зрозуміти, чому і щоб включити файл у вашу установку, але щоб встановити його лише у випадку помилки, я зробив його додатковим компонентом, який можна вибрати в параметрах налаштування.

HTH, Formentz


Дякую за це, я спробував усе інше, і це було рішення
Девід Бенко

4

Як говориться у вікі SQLite , розгортання вашої програми має бути:

Розгортання програми

Тому потрібно дотримуватися правил. Знайдіть dll, який відповідає вашій цільовій платформі, і поставте його в розташування, описане на малюнку. Dlls можна знайти в YourSolution / пакети / System.Data.SQLite.Core.% Версія% /.

У мене виникли проблеми з розгортанням програми, тому я просто додав правильний SQLite.Interop.dll до свого проекту, додав папку x86 до AppplicationFolder у програмі установки та додав посилання на DLL.


3

Ви також можете отримати цю помилку, якщо спробуєте запустити 32-бітний dll, у 64-бітному проекті.

Це я отримав, коли розмістив один і той же файл (SQLite.Interop.dll у 32-бітній версії) як у папках x86, так і x64.



3

Я не знаю, чому це ще не включено, але мені довелося провести дослідження і дізнатися це для себе, тому, сподіваюся, хтось знайде цю відповідь і врятує неприємності. Це було для програми WPF. Він добре працював на моїй скриньці Dev, але не працював на комп’ютері, де я його копіював, і отримала Unable to load DLL 'SQLite.Interop.dll'помилку. Я переніс усі пов'язані з цим каталоги та файли безпосередньо зі своєї папки "Налагодження" на цей інший комп'ютер, коли отримав таку ж помилку, що і ОП, коли запускав її. Мою папку "бін", яка містила мої DLL, було скопійовано у "Налагодження \ бін", і всі вони були включені разом із файлами моїх додатків, коли я робив копіювання на інший комп'ютер за допомогою цього шляху, тому в ньому не було відсутні файли.

Те, що я бачив, говорилося в інших відповідях, які не стосуються:

  • Я не використовував пакет NuGet або не потребував створення папок x86 або x64, схоже, що NuGet створює. Мої DLL (System.Data.SQLite та SQLite.Interop.dll, разом із System.Data.SQLite.config) знаходяться у папці "bin" у моєму проекті та були скопійовані вручну (створити папку "bin" у Explorer Solution Explorer у VS, вставте DLL-файли в цю папку в Провіднику Windows, використовуйте Додати> Існуючий елемент для введення файлів у папку / проект VS). Потім я посилаюсь на них як посилані збори в своєму проекті, використовуючи це місце ("Посилання"> "Додати довідку", і перейдіть до одного, промийте, повторіть для решти). Це гарантує, що мій проект точно знає, де вони знаходяться.
  • Мені не потрібно було посилатися на жоден файл DLL SQLite у своєму app.config або навіть торкатися мого файлу MyProject.csproj.
  • Мені навіть не потрібно було вказувати конкретний процесор! Модель мого проекту призначена для "Будь-якого процесора", хоча я маю лише змішані або 64-бітні DLL-файли і працюватимуть лише в ОС Windows 7+, які мають 64-бітні ОС. (без x86 / 32-бітових виключно DLL-файлів)
  • Я вже визначав їх як "Вміст" та "Скопіювати, якщо новіші" для цих DLL, коли я відчув помилку ОП.

Що я знайшов, це це з https://system.data.sqlite.org/index.html/doc/trunk/www/faq.wiki#q20 :

(11) Чому я отримую DllNotFoundException (для "sqlite3.dll" або "SQLite.Interop.dll"), коли намагаюся запустити свою програму?

Або названа бібліотека динамічних посилань (DLL) не може бути розміщена, або не може бути завантажена через відсутність залежностей. Переконайтесь, що названа бібліотека динамічних посилань знаходиться в каталозі додатків або в каталозі уздовж системи PATH та повторіть спробу. Крім того, переконайтесь, що встановлений необхідний перерозподільний пакет для перегляду Visual C ++, якщо ви не використовуєте бібліотеку динамічних посилань, яка була статично пов'язана з нею.

Наголос на моїй жирній частині всередині абзацу. Цільовий комп'ютер був свіжим і не мав завантажених програм, крім .NET 4.0. Після того, як я встановив C ++, він зміг виконати команди на SQLite. Це повинно було бути одним із перших поширених запитань та частиною необхідних умов, але його поховали в №11. Мій комп'ютер для розробки вже завантажив, тому що він постачався разом із Visual Studio, тому він там працював.

Завантажте:
перерозподілюваний Visual C ++ для Visual Studio 2015:
https://www.microsoft.com/en-us/download/details.aspx?id=48145

Оновлення 3 (сукупне оновлення):
https://www.microsoft.com/en-us/download/details.aspx?id=53587


3

Я почав використовувати Costura.Fody для упаковки (.net) збірок і вставляти та попередньо завантажувати натільні dll. Це також допомагає пізніше, при розподілі, оскільки ви можете надіслати один файл.

  1. Встановіть Costura Fody від Nuget.

  2. У своєму проекті C # створіть папку під назвою costrua32. Туди ж додайте будь-які рідні dll, які C # для завантаження.

  3. Після додавання їх до цієї папки. Клацніть на вікні властивостей та змініть дію збірки на "Вбудований ресурс"

  4. Нарешті потрібно змінити файл XML під назвою FodyWeavers.xml наступним чином. Тут я вказую, що спочатку завантажуйте sql dll. (зауважте, що ви скидаєте .dll)

    Weavers
     Costura
      PreloadOrder
       SQLite.Interop
       tbb_debug
       tbb
      /PreloadOrder>
     /Costura
    /Weavers

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


Назва папки має бути costura32, документація github.com/Fody/Costura#native-libraries-and-preloadorder
Елтон Сондерс


2

У мене виникла ця проблема, тому що Visual C ++ 2010 перерозподіляється не встановлено на моєму ПК. Якщо ви ще не встановили перерозподільний Visual c ++ 2010 Завантажте та встановіть це (перевірте x86 або 64 dll).


Так. Це був і мій випадок ... лише моя вимагала перерозподілу SP1 Visual C ++ 2010. Найкраще сулютація - це уважно прочитати, який час виконання потрібен для вашої версії. Наприклад тут: system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki
Веля

Останнє посилання: support.microsoft.com/en-us/help/2977003/…
didge

2

У мене така ж проблема. Однак, нарешті, я можу це виправити. В даний час я використовую Visual Studio 2013 Community Edition. Я просто використовую Add-> Existing Item ... і переглядаю, де знаходяться файли SQLite.Data.SQLite (у моєму випадку "C: \ Program Files (x86) \ System.Data.SQLite \ 2013 \ bin"). Будь ласка, не забудьте змінити тип того, що ви будете включати до складання файлів (* .dll; * .pdb) . Виберіть " SQLite.Interop.dll " у цій папці. Звідти і далі я можу продовжувати без проблем взагалі. Успіхів усім вам. ^ _ ^ PS Я створюю додаток для веб-форми. Я ще не пробував у програмі віконної форми чи інших.


2

Спробуйте встановити ціль платформи на x86 або x64 (а не на будь-який процесор) перед тим, як створити: Project-> Properties-> Build-> target Platform in Visual Studio.


2

Скопіюйте SQLite.Interop.dll в каталог проектів.

src\
  project\
      bin\   <-- Past in bin
         x64\
           SQLite.Interop.dll <-- Copy this if 64
         x86\
           SQLite.Interop.dll <-- Copy this if 32

Щоб вирішити проблему, я повинен був надати IIS_APPPOOL Редагувати дозволи на файл Bin. Тільки копіювання DDL спричиняло доступ, заборонений до dll
AlexanderD

Додавання цих файлів вирішило проблеми, але це тимчасове рішення.
Картик Гоял

2

Я довгий час боровся з цим, і час від часу я виявляв, що параметр тесту невірний. Дивіться це зображення: Налаштування тесту

Я просто зніміть прапорець із тестом, і проблема зникає. Інакше відбудеться виняток. Сподіваємось, це комусь допоможе. Не впевнений, що це першопричина.


1
Хоча це посилання може відповісти на питання, краще включити сюди суттєві частини відповіді та надати посилання для довідки. Відповіді лише на посилання можуть стати недійсними, якщо пов’язана сторінка зміниться. - З огляду
Роберт Колумбія

У моєму випадку файл тестових налаштувань неправильний: <TestSettings ... <Deployment> <DeploymentItem filename = "bin \ Relase \ a.test.dll". розташування файлу налаштовано неправильно.
Tony Sun

2

Скопіюйте файли "SQLite.Interop.dll" для x86 та x64 у папку налагодження. ці файли повинні копіюватися у папки «x86» та «x64 у папці налагодження.


2

Моя програма - це веб-додаток (ASP.NET MVC), і мені довелося змінити пул додатків для запуску LocalSystemзамість ApplicationPoolIdentity. Зробити це:

  1. Відкрийте менеджер IIS
  2. Знайдіть пул додатків, під яким працює ваш сайт.
  3. Клацніть Розширені налаштування від дій
  4. Змінити особу на LocalSystem

Я поняття не маю, чому це вирішує проблему.


1

Я не знаю, чи це хороша відповідь, але мені вдалося вирішити цю проблему, запустивши свою програму під AppDomain з ідентифікацією "Local System".


1

Я працюю над простою консольною програмою, щоб додати деякі тестові дані до бази даних SQLite, і я отримував цю помилку. Конфігурація проекту "Будь-який процесор". Я виправив це, скопіювавши SQLite.Interop.dll у папку bin \ debug. Кращим способом було б використання методу @Wil, але як це вказати для конфігурації "Будь-який процесор"?



1

Для довідок для всіх, хто дивиться на це питання:

Якщо ви використовуєте пакет nuget, він встановлює правило збірки, яке виконує копіювання для вас. (див. у розділі System.Data.SQLite.Core.1.0.94.0 \ build - або будь-яку інстальовану версію Core).

Основний інсталятор додає правило до файлу проекту автоматично.

Це все ще не вирішує проблему тестового випадку. Підхід DeploymentItem ( https://stackoverflow.com/a/24411049/89584 ) - це єдине, що, здається, працює там.


1

Я зіткнувся з цією проблемою, у рішенні веб-проекту WebAPI / MVC5 та проекту тестування функцій, який обидва вичерпав один і той же проект доступу до даних (або "Core"). Я, як і багато інших тут, використовую копію, завантажену через NuGet у Visual Studio 2013.

Що я зробив, у Visual Studio було додано папку рішень x86 та x64 до тестування функцій та веб-проектів. Потім я зробив Right Click | Add Existing Item...і додав відповідну бібліотеку SQLite.interop.dll ..\SolutionFolder\packages\System.Data.SQLite.Core.1.0.94.0\build\net451\[appropriate architecture]для кожної з цих папок. Тоді я зробив Right Click | Propertiesі став Copy to Output Directoryна Always Copy. Наступного разу, коли мені потрібно було запустити свої тести, тести пройшли успішно.

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