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?
Jawaban:
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.
sumber
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.
sumber
Saya punya masalah yang sama ketika menggunakan SQLite dalam proyek WPF yang target platformnya
Any CPU
. Saya memperbaikinya dengan mengikuti langkah-langkah berikut:prefer 32-bit
opsi.Atau, Anda bisa mengatur target platform ke
x86
ataux64
. Saya pikir masalah ini disebabkan olehSystem.Data.SQLite
perpustakaan 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
sumber
.csproj
file sudah ditetapkanfalse
, tetapi masih memiliki kesalahan.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:
Dan inilah yang dimiliki versi KERJA:
Setelah kembali, saya tidak menerima pengecualian. File DLL dibuang di folder Debug \ x64 (dll) yang sesuai.
sumber
Jadi, setelah menambahkan NuGet penyebaran tidak menyalin Interops. Anda dapat menambahkan ini ke file csproj Anda dan itu harus memperbaiki perilaku itu:
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.
sumber
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.
sumber
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
DeploymentItem
atribut pada kelas pengujian saya yang menguji layanan berbasis SQLite.Contoh:
Ini menyebabkan kebutuhan
SQLite.Interop.dll
untuk disalin kex86
direktori dalam folder "TestResults" yang sesuai.Semuanya berwarna hijau. Semua baik.
sumber
Memperbarui NuGet dari
Tools -> Extension and updates
dan menginstal ulang SQLite.Core dengan perintahPM> Update-Package -reinstall System.Data.SQLite.Core
memperbaikinya untuk saya.sumber
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
sumber
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;
Setel semua Proyek solusi Anda ke
x86
ataux64
dalam opsi build.Tambahkan berikut
Post-Build-Script
ke Proyek denganSQLite nuget Package
:xcopy "$(TargetDir)x64" "$(SolutionDir)bin\Debug\" /y
Tentu saja Anda harus mengubah skrip untuk
Release Build
danx86
membangun.STL; DR;
Letakkan file
SQLite.Interop.dll
berikutnya di sebelah Anda*.exe
.sumber
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 ():
Kemudian gunakan metode Anda sendiri untuk menentukan subdirektori yang benar untuk menemukan versi spesifik arsitektur 'SQLite.Interop.dll'. Saya menggunakan kode berikut:
sumber
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
sumber
Seperti yang dikatakan wiki SQLite , penyebaran aplikasi Anda harus:
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.
sumber
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.
sumber
Jika Anda mengunduh biner yang benar untuk
SQLite
kemudian salinSQLite.Interop.dll
ke folder Release atau Debug Anda sesuai dengan opsi build proyek Anda.sumber
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:
Apa yang saya temukan adalah ini, dari https://system.data.sqlite.org/index.html/doc/trunk/www/faq.wiki#q20 :
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
sumber
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.
Instal Costura Fody dari Nuget.
Dalam proyek C # Anda buat folder bernama costrua32. Di sana tambahkan dll asli Anda mana C # untuk memuat.
Setelah Anda menambahkannya ke folder ini. Klik pada jendela properti dan ubah build action menjadi "Embedded Resource"
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)
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.
sumber
Juga menambahkan dll ke proyek uji (melalui Nuget Manager) dan memperbaikinya.
sumber
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).
sumber
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.
sumber
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.
sumber
Salin SQLite.Interop.dll dalam direktori proyek.
sumber
Saya telah berjuang dengan ini untuk waktu yang lama, dan, kadang-kadang, saya menemukan bahwa pengaturan tes salah. Lihat gambar ini:
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.
sumber
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.
sumber
Aplikasi saya adalah sebuah aplikasi web (ASP.NET MVC) dan saya harus mengubah kolam aplikasi untuk berjalan di bawah
LocalSystem
bukanApplicationPoolIdentity
. Untuk melakukan ini:LocalSystem
Saya tidak tahu mengapa ini memperbaiki masalah.
sumber
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".
sumber
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"?
sumber
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
sumber
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.
sumber
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 melakukanRight Click | Properties
, dan setCopy to Output Directory
keAlways Copy
. Lain kali saya perlu menjalankan tes fitur saya, tes berjalan dengan sukses.sumber