Tidak dapat memuat DLL 'SQLite.Interop.dll'

205

Secara berkala saya mendapatkan pengecualian berikut:

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

Saya menggunakan 1.0.82.0. versi, menginstalnya dengan nuget di VS2010, OS Win7 64.

Setelah pengecualian mulai muncul, itu muncul terus-menerus - dalam debug dan lepaskan dan jalankan aplikasi di dalam atau di luar VS.

Satu-satunya cara untuk menghentikannya adalah masuk dan keluar. Pengecualian tidak dilemparkan dan dll dimuat. Itu bisa bekerja berhari-hari, tapi kemudian bisa pecah lagi.

Adakah yang melihat sesuatu seperti ini dan apakah ada solusi untuk itu?

xll
sumber
2
Ya, selalu disetel untuk menyalin. Saya memiliki folder x64 dan x86 di bin / debug. Dan itu bekerja sebagian besar, tetapi kadang-kadang hanya berhenti bekerja. Mungkin ada sesuatu yang memblokir akses ke dll, saya akan mencoba mencari tahu waktu berikutnya berhenti bekerja. Seperti yang saya katakan itu mungkin bekerja berhari-hari tanpa masalah.
xll
13
Saya mendapatkan kesalahan ini langsung dari kotak setelah menambahkan paket nuget SQLite ke proyek konsol baru. Menyalin secara manual SQLite.Interop.dll dari folder x86 satu tingkat memungkinkan aplikasi untuk berjalan. Sepertinya aneh bagi saya bahwa ini akan sangat rusak.
lesscode
@Wayne Ya, ini pasti membantu. Tetapi dalam kasus saya, kami bekerja bersama dalam proyek ini, dan teman saya menggunakan x86, sementara saya x64 OS. Dan seperti yang saya perhatikan, kadang berhenti bekerja saja. Meskipun itu tidak terjadi pada saya bulan lalu.
xll
1
Jika Anda mengunduh biner yang benar untuk SQLite, lalu salin SQLite.Interop.dll ke dalam folder Release atau Debug Anda sesuai dengan opsi build proyek Anda.
Elshan
Ini adalah bug acak ... kadang-kadang terjadi dan kadang-kadang tidak untuk proyek saya. Mencoba semuanya.
BK

Jawaban:

141

Saya tahu saya terlambat ke pesta tetapi saya memiliki masalah ini tepat setelah saya menarik x86 / x64 terbaru hari ini (versi 1.0.88.0). IIS lokal saya di VS2012 menjalankan 32bit secara default dan tidak ada cara mudah untuk beralih ke x64. Server produksi saya berjalan 64bit.

Lagi pula saya menginstal paket NuGet ke proyek DLL dan saya mendapat kesalahan ini. Apa yang harus saya lakukan untuk membuatnya berfungsi, saya harus menginstalnya ke proyek situs utama , juga. Bahkan jika itu tidak menyentuh kelas SQLite sama sekali.

Dugaan saya adalah bahwa SQLite menggunakan entri entri untuk mendeteksi versi Interop mana yang dimuat.

Kugel
sumber
11
Ini bekerja untuk saya setelah saya menambahkan referensi ke SQLite Core dengan NuGet ke proyek utama.
Luca Cremonesi
Menambahkan sqllite.core ke proyek utama bekerja untuk saya pada solusi WPF saya
Dipu Raj
Saya harus melakukan keduanya menginstal-paket Sqlite maupun Instal-Paket System.Data.SQLite.Core ke situs web saya meskipun panggilan db di perpustakaan ...
Ini seharusnya jawabannya.
Bobby Turkalino
4
Apa yang Anda maksud dengan proyek "situs utama"? Dalam kasus saya, saya melakukan pekerjaan desktop. Apakah maksud Anda proyek "startup"?
UuDdLrLrSs
60

Saya punya masalah ini karena dll saya menggunakan punya Sqlite sebagai dependensi (dikonfigurasi dalam NuGet hanya dengan paket inti Sqlite.). Proyek mengkompilasi dan menyalin semua Sqlite dll-s kecuali 'SQLite.Interop.dll' (folder x86 dan x64).

Solusinya sangat sederhana: cukup tambahkan paket Sqlite.Core sebagai ketergantungan (dengan NuGet) ke proyek yang sedang Anda bangun / jalankan dan dll-s akan disalin.

Marin
sumber
Bekerja untukku! Terima kasih
Tristan Djahel
Sepakat. Saya menggunakan paket 'Sqlite.Net PCL' tetapi ternyata saya juga membutuhkan 'System.Data.SQLite Core (x86 / x64)'. Saya juga harus mengubah proyek yang merujuknya untuk menggunakan target Platform 'x86' atau 'x64', daripada 'Any CPU'.
Andrew Stephens
2
Sudah mencoba beberapa solusi yang diposting di sini, yang ini benar-benar berhasil dengan sangat baik.
Batman
2
Bagaimana Anda bisa menambahkan ketergantungan seperti itu? tidak pernah melakukannya (VS2013)
jpgrassi
3
Pergi ke Alat -> Pengelola Paket NuGet -> Kelola Paket NuGet untuk Solusi ... -> Online -> Semua. Kemudian Cari sqlite dan tambahkan System.Data.SQLite Core (x86 / x64).
Marin
44

Saya punya masalah yang sama ketika menggunakan SQLite dalam proyek WPF yang target platformnya Any CPU. Saya memperbaikinya dengan mengikuti langkah-langkah berikut:

  1. Buka perancang proyek di Visual Studio. Rincian tentang cara melakukannya dapat ditemukan di sini .
  2. Klik pada tab Build.
  3. Nonaktifkan prefer 32-bitopsi.

Atau, Anda bisa mengatur target platform ke x86atau x64. Saya pikir masalah ini disebabkan oleh System.Data.SQLiteperpustakaan menggunakan target platform untuk mendapatkan lokasi file 'SQLite.Interop.dll'.

MEMPERBARUI:

Jika perancang proyek tidak dapat dihubungi, cukup buka file project ( *.csproj) dari editor teks dan tambahkan nilainya <Prefer32Bit>false</Prefer32Bit>ke dalam <PropertyGroup>...</PropertyGroup>tag.

Kode contoh

<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>
Caleb Kiage
sumber
Saya menggunakan VS 2010, tidak ada opsi seperti itu.
xll
@ xll, saya mengedit jawaban untuk klarifikasi. Periksa apakah hasil edit sudah beres.
Caleb Kiage
10
Dalam VS2012 opsi ini berwarna abu-abu untuk saya.
Kugel
6
Opsi ini hanya diaktifkan pada proyek EXE, tapi saya pikir sebagian besar dari kita memiliki masalah ini dengan proyek unit test.
Brannon
1
Apakah greyed bagi saya dalam proyek WPF di VS Pro 2015. .csprojfile sudah ditetapkan false, tetapi masih memiliki kesalahan.
vapcguy
32

Ini adalah bagaimana saya memperbaikinya dalam proyek saya.

Itu berfungsi, dan ketika seorang rekan mengirimkan perubahannya, saya menerima pengecualian "Tidak dapat memuat DLL 'SQLite.Interop.dll'".

Difing file .csproj proyek, ini dalam versi NON-KERJA:

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

Dan inilah yang dimiliki versi KERJA:

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

Setelah kembali, saya tidak menerima pengecualian. File DLL dibuang di folder Debug \ x64 (dll) yang sesuai.

Wil
sumber
<itemgroup> untuk "SQLite.Interop.dll" tidak ada dalam file .csproj proyek. masih saya mencoba untuk menambahkan solusi Anda tetapi tidak berhasil :(
ayc
Ini tidak akan berfungsi di VS2012, elemen tidak ada.
htm11h
Terima kasih banyak. Bekerja pada 2015 vs
Jevgenij Kononov
29

Jadi, setelah menambahkan NuGet penyebaran tidak menyalin Interops. Anda dapat menambahkan ini ke file csproj Anda dan itu harus memperbaiki perilaku itu:

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

Jika Anda melihat sumber untuk NuGet untuk SQLite, Anda dapat melihat apa yang dilakukan secara khusus. Ini memungkinkan saya untuk mendapatkan penyebaran yang bekerja dengan ASP.Net Core.

b
sumber
10
ContentSQLiteInteropFiles adalah jawabannya. Sebagian besar jawaban teratas adalah dugaan.
Corey Alix
6
Ya, ContentSQLiteInteropFiles adalah jawabannya. 1. Ini harus menjadi jawaban yang diterima 2. Di sisi lain, itu harus diselidiki, bahwa sebagai paket nuget cara membuat ini bekerja secara otomatis, atau setidaknya mendokumentasikan kebutuhan untuk konfigurasi ini.
gerleim
Seharusnya jawaban yang diterima. Sangat sederhana. 1. bongkar proyek 2. tambahkan di atas ke csproj 3. muat ulang proyek. semudah itu ...
BillRuhl
24

Ketika Anda berada dalam kondisi ini, coba lakukan Rebuild-All. Jika ini memperbaiki masalah, Anda mungkin memiliki masalah yang sama dengan saya.

Beberapa latar belakang (pemahaman saya) :

  • SQLite memiliki 1 rakitan terkelola (System.Data.SQLite.dll) dan beberapa rakitan khusus platform (SQLite.Interop.dll). Saat memasang SQLite dengan Nuget, Nuget akan menambahkan rakitan khusus platform ke proyek Anda (dalam beberapa folder: \ x86, \ x64), dan mengonfigurasi dll ini ke "Salin Selalu".

  • Setelah dimuat, rakitan terkelola akan mencari rakitan khusus platform di dalam folder \ x86 dan \ x64. Anda dapat melihatnya di sini . Pengecualiannya adalah rakitan terkelola ini berusaha menemukan yang relevan (SQLite.Interop.dll) di dalam folder ini (dan gagal).

Skenario Saya :

Saya memiliki 2 proyek dalam solusi saya; aplikasi WPF, dan perpustakaan kelas. Aplikasi WPF referensi perpustakaan kelas, dan perpustakaan kelas referensi SQLite (diinstal melalui Nuget).

Masalahnya bagi saya adalah ketika saya hanya memodifikasi aplikasi WPF, VS mencoba untuk melakukan pembangunan kembali parsial (menyadari bahwa dll yang tergantung tidak berubah). Di suatu tempat dalam proses ini, VS membersihkan konten folder \ x86 dan \ x64 (meniup SQLite.Interop.dll). Ketika saya melakukan Rebuild-All penuh, VS menyalin folder dan isinya dengan benar.

Solusi Saya :

Untuk memperbaikinya, saya akhirnya menambahkan proses Post-Build menggunakan xcopy untuk memaksa menyalin folder \ x86 dan \ x64 dari perpustakaan kelas ke direktori \ bin proyek WPF saya.

Atau, Anda dapat melakukan hal-hal yang lebih menarik dengan direktori konfigurasi konfigurasi / keluaran.

sfm
sumber
1
Pesan yang saya dapat mengatakan kepada saya bahwa file-file itu hilang tetapi saya pikir itu adalah masalah izin. Setelah saya melihat pesan Anda, saya menyadari bahwa mereka tidak pernah benar-benar membuatnya ke server ketika saya ditempatkan.
Stradas
1
Solusi saya yang hampir sama adalah menambahkan folder x86 dan x64 ke proyek startup saya, kemudian menambahkan file interop x86 dan x64 di dalam folder masing-masing. Saya mengatur opsi file ke "konten" dan "membangun selalu." Ini adalah satu-satunya cara saya bisa mendapatkan aplikasi Windows Forms saya untuk terhubung ke file database s3db tertanam ketika saya menyebarkan aplikasi dengan ClickOnce ke PC lain. Dengan frustrasi, saya tidak memiliki kesalahan SQLite ketika saya mengembangkan dan menguji aplikasi pada PC saya.
David Alan Condit
Masih terjadi dengan VS 2017: '(
wmebane
1
Ini adalah jawaban yang membantu saya memahami masalah saya, meskipun perbaikan saya agak berbeda. Masalah saya adalah saya menambahkan system.data.Sqlite.dll secara manual. Dengan cara ini Sqlite.Interop.dll tidak secara otomatis disalin ke \ x86 dan x64. Cara mengatasinya adalah menghapus referensi dan menambahkannya dengan Nuget.
Susan Wang
19

Saya memiliki masalah yang sama menjalankan Visual Studio Express 2013. Saya mencoba beberapa solusi yang disebutkan di sini dan di tempat lain tetapi tidak berhasil. Saya harap perbaikan ini membantu orang lain.

Saya memperbaikinya dengan menggunakan DeploymentItematribut pada kelas pengujian saya yang menguji layanan berbasis SQLite.

Contoh:

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

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

Ini menyebabkan kebutuhan SQLite.Interop.dlluntuk disalin ke x86direktori dalam folder "TestResults" yang sesuai.

Semuanya berwarna hijau. Semua baik.

Michael Bromley
sumber
1
Solusi ini hanya berfungsi jika Anda menggunakan Microsoft.VisualStudio.TestTools.UnitTesting namespace
sapbucket
4
Ini adalah solusi yang tepat jika Anda menggunakan MSTest. SQLite bekerja dengan baik, menemukan SQLite.Interop.dll tanpa masalah, sampai saya menggunakan DeploymentItem ("some.csv") untuk pengujian. Termasuk file .csv dengan cara itu memicu MSTest untuk menyalin semua dll yang direferensikan ke direktori TestResults. Karena SQLite.Interop.dll tidak direferensikan dalam proyek (dan tidak bisa karena itu kode yang tidak dikelola), itu tidak pernah disalin.
Johann
Taruhan terbaik Anda adalah menambahkan dua baris, satu untuk setiap arsitektur. Itu melindungi Anda jika pelari uji menjalankan 64-bit.
Kirk Woll
13

Memperbarui NuGet dari Tools -> Extension and updatesdan menginstal ulang SQLite.Core dengan perintah PM> Update-Package -reinstall System.Data.SQLite.Corememperbaikinya untuk saya.

Filippo Vigani
sumber
Jika Anda mendapatkan kesalahan saat melakukan ini, menghapus DLL / referensi SQLite saya dan menginstal ulang sepenuhnya dari nuget melakukan trik untuk saya
KayakinKoder
instal kembali sqllite core membantu saya juga. Terjadi pada VS2012. VS tidak menyertakan paket versi x62 ke web deploy
Andrey R
Memperbaiki saya juga di VS2015 Professional.
Rahul Kishore
9

Saya memiliki masalah serupa dalam solusi beberapa proyek. SQLite.Interop.dll diperlukan untuk salah satu plugin yang didistribusikan dengan perangkat lunak menggunakan ClickOnce.

Sejauh debugging di visual studio semuanya bekerja dengan baik, tetapi versi yang digunakan hilang folder x86 / dan x64 / berisi DLL itu.

Solusi untuk membuatnya berfungsi setelah penyebaran menggunakan ClickOnce adalah dengan membuat dalam proyek startup dari solusi (juga yang diterbitkan) kedua subfolder ini, salin ke mereka DLL dan tetapkan mereka sebagai Content Copy Always.

Dengan cara ini alat penerbitan ClickOnce secara otomatis menyertakan file dan folder ini dalam manifes dan menyebarkan perangkat lunak dengannya

pengguna1892410
sumber
1
ini adalah satu-satunya solusi yang bekerja untuk saya ... dan anak laki-laki .. apakah itu susah untuk debug ketika aplikasi Anda hanya ditutup pada pc pengguna.
tabah
8

Sebenarnya ada banyak jawaban di sini, tetapi jawaban saya sederhana dan jelas tanpa bermain-main dengan GAC .

Masalahnya adalah, File yang dapat dieksekusi membutuhkan salinan hak SQLite.Interop.dll(x86 atau x64) untuk mengakses Database kami.

Sebagian besar arsitektur memiliki lapisan dan dalam kasus saya Layer Data memiliki DLL yang diperlukan untuk Koneksi SQLite.

Jadi saya sederhana menempatkan skrip membangun posting ke Solusi Lapisan Data saya dan semuanya bekerja dengan baik.


TL; DR;

  1. Setel semua Proyek solusi Anda ke x86atau x64dalam opsi build.

  2. Tambahkan berikut Post-Build-Scriptke Proyek dengan SQLite nuget Package:

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

Tentu saja Anda harus mengubah skrip untuk Release Builddan x86membangun.


STL; DR;

Letakkan file SQLite.Interop.dllberikutnya di sebelah Anda *.exe.

Smartis
sumber
6

Instalasi default versi multi-arsitektur (x86, x64) dari SQLite dari NuGet memperlihatkan perilaku yang Anda jelaskan. Jika Anda ingin memuat versi yang benar untuk arsitektur aktual yang .NET runtime memilih untuk menjalankan aplikasi Anda di mesin Anda, maka Anda dapat memberi petunjuk kepada DLL loader tentang di mana menemukan perpustakaan yang benar sebagai berikut:

Tambahkan deklarasi untuk panggilan fungsi kernel32.dll ke SetDLLDirectory () sebelum Program Anda. Utama ():

    [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);

Kemudian gunakan metode Anda sendiri untuk menentukan subdirektori yang benar untuk menemukan versi spesifik arsitektur 'SQLite.Interop.dll'. Saya menggunakan kode berikut:

    [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));
Kevin Smathers
sumber
4

bahkan jika itu adalah posting lama, saya ingin membagikan solusi yang saya temukan di sini: http://system.data.sqlite.org/index.html/info/54e52d4c6f

Jika Anda tidak ingin membaca semua masalah, solusinya adalah menyalin file "msvcr100.dll" (yang dapat ditemukan di direktori Windows \ System32) di jalur yang sama dengan SQLite.Interop.dll.

Saya akan menyarankan untuk membaca masalah untuk memahami mengapa, dan untuk memasukkan file dalam pengaturan Anda tetapi untuk menginstalnya hanya jika kesalahan terjadi, saya menjadikannya komponen opsional yang dapat dipilih dalam opsi pengaturan.

HTH, Formentz

Formentz
sumber
Terima kasih banyak untuk ini, saya mencoba segalanya dan ini solusinya
David Benko
4

Seperti yang dikatakan wiki SQLite , penyebaran aplikasi Anda harus:

Penerapan aplikasi

Jadi, Anda harus mengikuti aturan. Temukan dll yang cocok dengan platform target Anda dan letakkan di lokasi, jelaskan dalam gambar. Dlls dapat ditemukan di YourSolution / packages / System.Data.SQLite.Core.% Versi% /.

Saya punya masalah dengan penyebaran aplikasi, jadi saya baru saja menambahkan SQLite.Interop.dll ke dalam proyek saya, folder x86 ditambahkan ke AppplicationFolder dalam proyek pengaturan dan menambahkan referensi file ke dll.

Keltar Helviett
sumber
3

Anda juga bisa mendapatkan kesalahan ini jika Anda mencoba menjalankan dll 32 bit, dalam proyek 64 bit.

Saya mendapatkan ini ketika saya telah menempatkan file yang sama (SQLite.Interop.dll dalam versi 32 bit) di folder x86 dan x64.

Morten Holmgaard
sumber
3

Jika Anda mengunduh biner yang benar untuk SQLitekemudian salin SQLite.Interop.dllke folder Release atau Debug Anda sesuai dengan opsi build proyek Anda.

Elshan
sumber
3

Saya tidak tahu mengapa ini belum dimasukkan, tetapi saya harus melakukan penelitian dan mencari tahu sendiri, jadi mudah-mudahan seseorang akan menemukan jawaban ini dan menyelamatkan masalahnya. Ini untuk aplikasi WPF. Ini bekerja dengan baik di kotak Dev saya, tetapi tidak berfungsi di komputer tempat saya menyalinnya dan mendapatkan Unable to load DLL 'SQLite.Interop.dll'kesalahan. Saya porting ke semua direktori dan file yang terkait, langsung dari folder "Debug" ke komputer lain ini ketika saya mendapatkan kesalahan yang sama dengan OP ketika saya menjalankannya. Folder "bin" saya yang berisi DLL saya telah disalin ke "Debug \ bin" dan semuanya dimasukkan, bersama dengan file aplikasi saya ketika saya menyalin ke komputer lain menggunakan jalur ini, jadi tidak ada file yang hilang.

Hal-hal yang saya lihat mengatakan dalam jawaban lain yang tidak berlaku:

  • Saya tidak menggunakan paket NuGet atau perlu membuat folder x86 atau x64 yang tampaknya dibuat oleh paket NuGet. DLL saya (System.Data.SQLite dan SQLite.Interop.dll, bersama dengan System.Data.SQLite.config) ada di folder "bin" di proyek saya dan disalin secara manual (buat folder "bin" di Solution Explorer di VS, rekatkan DLL ke folder ini di Windows Explorer, gunakan Tambah> Item yang Ada untuk membawa file ke folder / proyek VS). Kemudian saya referensi mereka sebagai Majelis Dirujuk dalam proyek saya menggunakan lokasi itu ("Referensi"> "Tambahkan Referensi", dan browse ke satu, bilas, ulangi untuk sisanya). Ini memastikan proyek saya tahu persis di mana mereka berada.
  • Saya tidak perlu referensi file DLL SQLite di app.config saya atau bahkan menyentuh file MyProject.csproj saya.
  • Saya bahkan tidak perlu menentukan prosesor tertentu! Build proyek saya adalah untuk "Any CPU", meskipun saya hanya memiliki DLL campuran atau 64-bit dan hanya akan berjalan pada Windows 7+, yang merupakan OS 64-bit. (tanpa DLL x86-only / 32-bit semata-mata)
  • Saya sudah menetapkan mereka sebagai "Konten" dan "salin jika lebih baru" untuk DLL ini ketika saya mengalami kesalahan OP.

Apa yang saya temukan adalah ini, dari https://system.data.sqlite.org/index.html/doc/trunk/www/faq.wiki#q20 :

(11) Mengapa saya mendapatkan DllNotFoundException (untuk "sqlite3.dll" atau "SQLite.Interop.dll") ketika mencoba menjalankan aplikasi saya?

Pustaka tautan dinamis yang dinamai (DLL) tidak dapat ditemukan atau tidak dapat dimuat karena dependensi yang hilang. Pastikan pustaka tautan dinamis bernama terletak di direktori aplikasi atau direktori di sepanjang PATH sistem dan coba lagi. Juga, pastikan runtime Visual C ++ yang diperlukan redistributable telah diinstal kecuali Anda menggunakan pustaka tautan dinamis yang dibuat secara statis yang terhubung dengannya.

Tekankan milikku pada bagian yang tebal di dalam paragraf. Komputer target segar dan tidak ada program yang dimuat kecuali .NET 4.0. Setelah saya menginstal C ++, ia dapat menyelesaikan perintah ke SQLite. Ini seharusnya menjadi salah satu FAQ pertama dan bagian dari prasyarat, tetapi dimakamkan di # 11. Komputer pengembangan saya sudah memuatnya karena ia datang dengan Visual Studio, jadi itu sebabnya bekerja, di sana.

Unduh:
Visual C ++ Redistributable untuk Visual Studio 2015:
https://www.microsoft.com/en-us/download/details.aspx?id=48145

Pembaruan 3 (pembaruan kumulatif):
https://www.microsoft.com/en-us/download/details.aspx?id=53587

vapcguy
sumber
3

Saya sudah mulai menggunakan Costura.Fody untuk mengemas (.net) rakitan dan menyematkan dan menginstal ulang dll asli. Ini juga membantu nanti, dengan distribusi karena Anda dapat mengirim satu file.

  1. Instal Costura Fody dari Nuget.

  2. Dalam proyek C # Anda buat folder bernama costrua32. Di sana tambahkan dll asli Anda mana C # untuk memuat.

  3. Setelah Anda menambahkannya ke folder ini. Klik pada jendela properti dan ubah build action menjadi "Embedded Resource"

  4. Akhirnya Anda perlu mengubah file XML yang disebut FodyWeavers.xml sebagai berikut. Di sini saya menentukan memuat sql dll terlebih dahulu. (perhatikan Anda menjatuhkan .dll)

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

Keuntungan dari hal ini adalah Anda tidak perlu menulis acara pra atau pasca pembuatan apa pun, dan produk akhirnya dienkapsulasi sepenuhnya menjadi satu file yang lebih besar.

derit
sumber
Nama folder harus costura32, dokumentasi github.com/Fody/Costura#native-libraries-and-preloadorder
Elton Saunders
3

Juga menambahkan dll ke proyek uji (melalui Nuget Manager) dan memperbaikinya.

Antonin GAVREL
sumber
2

Aku punya masalah ini karena Visual C ++ 2010 disebarkan kembali tidak dipasang di PC.if saya Anda belum menginstal Visual c ++ 2010 didistribusikan download dan menginstal ini (cek x86 atau 64 dll).

Ali Yousefi
sumber
Iya. Ini adalah kasus saya juga ... hanya milik saya yang membutuhkan Visual C ++ 2010 SP1 yang dapat didistribusikan kembali. Best soulution adalah membaca dengan hati-hati runtime mana yang diperlukan untuk versi Anda. Sebagai contoh di sini: system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki
Velja Radenkovic
2

Saya mendapat masalah yang sama. Namun, akhirnya, saya bisa memperbaikinya. Saat ini, saya menggunakan Visual Studio 2013 Community Edition. Saya hanya menggunakan Add-> Existing Item ... dan browse ke tempat file SQLite.Data.SQLite berada (kasus saya adalah 'C: \ Program Files (x86) \ System.Data.SQLite \ 2013 \ bin'). Harap jangan lupa untuk mengubah jenis apa yang akan Anda sertakan ke File Perakitan (* .dll; * .pdb) . Pilih ' SQLite.Interop.dll ' di folder itu. Dari sana dan kemudian, saya bisa melanjutkan tanpa masalah sama sekali. Semoga beruntung untuk kalian semua. ^ _ ^ PS Saya membuat aplikasi formulir web. Saya belum mencoba aplikasi formulir jendela atau yang lain.

Kayun Chan
sumber
2

Cobalah untuk mengatur target platform ke x86 atau x64 (dan bukan CPU apa pun) sebelum Anda membangun: Project-> Properties-> Build-> Target platform di Visual Studio.

thardes2
sumber
2

Salin SQLite.Interop.dll dalam direktori proyek.

src\
  project\
      bin\   <-- Past in bin
         x64\
           SQLite.Interop.dll <-- Copy this if 64
         x86\
           SQLite.Interop.dll <-- Copy this if 32
Ahmad Aghazadeh
sumber
Saya harus memberikan izin Edit IIS_APPPOOL ke file Bin untuk menyelesaikan masalah. Hanya menyalin ddl menyebabkan Akses Ditolak ke dll
AlexanderD
Menambahkan file ini telah menyelesaikan masalah, tetapi ini adalah solusi sementara.
Kartik Goyal
2

Saya telah berjuang dengan ini untuk waktu yang lama, dan, kadang-kadang, saya menemukan bahwa pengaturan tes salah. Lihat gambar ini: Pengaturan tes

Saya baru saja hapus centang pengaturan tes, dan masalah ini hilang. Kalau tidak, pengecualian akan terjadi. Semoga ini bisa membantu seseorang. Tidak yakin itu penyebab utamanya.

Tony Sun
sumber
1
Meskipun tautan ini dapat menjawab pertanyaan, lebih baik untuk memasukkan bagian-bagian penting dari jawaban di sini dan memberikan tautan untuk referensi. Jawaban hanya tautan dapat menjadi tidak valid jika halaman tertaut berubah. - Dari Ulasan
Robert Columbia
Dalam kasus saya, file tes pengaturan salah: <TestSettings ... <Deployment> <DeploymentItem filename = "bin \ Relase \ a.test.dll". lokasi file salah dikonfigurasi.
Tony Sun
2

Salin file "SQLite.Interop.dll" untuk x86 dan x64 di folder debug. file-file ini harus disalin ke folder "x86" dan "x64 di folder debug.

titik air mata
sumber
2

Aplikasi saya adalah sebuah aplikasi web (ASP.NET MVC) dan saya harus mengubah kolam aplikasi untuk berjalan di bawah LocalSystembukan ApplicationPoolIdentity. Untuk melakukan ini:

  1. Buka IIS Manager
  2. Temukan Kumpulan Aplikasi tempat situs Anda berjalan.
  3. Klik Pengaturan Lanjut dari tindakan
  4. Ubah Identitas menjadi LocalSystem

Saya tidak tahu mengapa ini memperbaiki masalah.

CodingYoshi
sumber
1

Saya tidak tahu apakah ini jawaban yang baik, tetapi saya bisa menyelesaikan masalah ini dengan menjalankan aplikasi saya di bawah AppDomain dengan identitas "Sistem Lokal".

Jesse McDowell
sumber
1

Saya sedang mengerjakan aplikasi konsol sederhana untuk menambahkan beberapa data uji ke database SQLite dan mendapatkan kesalahan ini. Konfigurasi untuk proyek ini adalah "Any CPU". Saya memperbaikinya dengan menyalin SQLite.Interop.dll ke folder bin \ debug. Cara yang lebih baik adalah menggunakan metode ini dengan @Wil, tetapi bagaimana Anda menentukan ini untuk konfigurasi "Any CPU"?

pwrgreg007
sumber
1

Mungkinkah ada perselisihan untuk majelis? Periksa untuk melihat apakah ada aplikasi lain dengan kunci file pada DLL.

Jika ini alasannya, seharusnya mudah menggunakan alat seperti Sysinternal's Process Explorer untuk menemukan program yang menyinggung.

HTH, Clay

Clay Compton
sumber
1

Untuk referensi bagi siapa pun yang melihat pertanyaan ini:

Jika Anda menggunakan paket nuget, ia menginstal aturan build yang melakukan penyalinan untuk Anda. (lihat di bawah System.Data.SQLite.Core.1.0.94.0 \ build - atau versi Core apa pun yang Anda instal).

Pemasang nuget menambahkan aturan ke file proyek Anda secara otomatis.

Ini masih belum memperbaiki masalah test case. Pendekatan DeploymentItem ( https://stackoverflow.com/a/24411049/89584 ) adalah satu-satunya hal yang tampaknya bekerja di sana.

Malcolm
sumber
1

Saya mengalami masalah ini, dalam solusi dengan proyek web WebAPI / MVC5 dan proyek Uji Fitur, yang keduanya menarik dari proyek akses data yang sama (atau, 'Core'). Saya, seperti banyak orang lain di sini, saya menggunakan salinan yang diunduh melalui NuGet di Visual Studio 2013.

Apa yang saya lakukan, berada di Visual Studio menambahkan folder solusi x86 dan x64 ke Feature Test dan Web Projects. Saya kemudian melakukan Right Click | Add Existing Item..., dan menambahkan perpustakaan SQLite.interop.dll yang sesuai ..\SolutionFolder\packages\System.Data.SQLite.Core.1.0.94.0\build\net451\[appropriate architecture]untuk masing-masing folder tersebut. Saya kemudian melakukan Right Click | Properties, dan set Copy to Output Directoryke Always Copy. Lain kali saya perlu menjalankan tes fitur saya, tes berjalan dengan sukses.

Andrew Gray
sumber