Tidak dapat memuat file atau rakitan 'System.Data.SQLite'

126

Saya telah menginstal ELMAH 1.1. Net 3.5 x64 di proyek ASP.NET saya dan sekarang saya mendapatkan kesalahan ini (setiap kali saya mencoba melihat halaman apa pun):

Tidak dapat memuat file atau rakitan 'System.Data.SQLite, Versi = 1.0.61.0, Culture = netral, PublicKeyToken = db937bc2d44ff139' atau salah satu dari dependensinya. Upaya telah dilakukan untuk memuat program dengan format yang salah.

Deskripsi: Pengecualian yang tidak ditangani terjadi selama eksekusi permintaan web saat ini. Harap tinjau jejak tumpukan untuk informasi lebih lanjut tentang kesalahan dan dari mana asalnya dalam kode.

Detail Pengecualian: System.BadImageFormatException: Tidak dapat memuat file atau assembly 'System.Data.SQLite, Versi = 1.0.61.0, Budaya = netral, PublicKeyToken = db937bc2d44ff139' atau salah satu dari dependensinya. Upaya telah dilakukan untuk memuat program dengan format yang salah.

Lebih banyak detail kesalahan di bagian bawah.

Platform Solusi Aktif Saya adalah "Any CPU" dan saya menjalankan pada x64 Windows 7 pada x64, tentu saja, prosesor. Alasan mengapa kami menggunakan versi ELMAH ini adalah karena 1.0. Net 3.5 (x86, yang merupakan satu-satunya platform yang dikompilasi) memberikan kesalahan yang sama pada server Windows x64 kami.

Saya sudah mencoba mengkompilasi untuk x86 dan x64 dan saya mendapatkan kesalahan yang sama. Saya sudah mencoba menghapus semua keluaran kompiler (bin dan obj). Akhirnya saya membuat referensi ke SQLite dll secara langsung, sesuatu yang tidak diperlukan untuk proyek untuk bekerja di server dan saya punya kesalahan kompiler ini:

Kesalahan 1 Peringatan sebagai Kesalahan: Pembuatan perakitan - perakitan yang direferensikan 'System.Data.SQLite.dll' menargetkan prosesor MyProject yang berbeda

Ada ide apa masalahnya?

Lebih detail kesalahan:

Kesalahan Sumber:

Pengecualian yang tidak tertangani dihasilkan selama eksekusi permintaan web saat ini. Informasi mengenai asal dan lokasi pengecualian dapat diidentifikasi menggunakan jejak tumpukan pengecualian di bawah ini.

Jejak Tumpukan:

[BadImageFormatException: Tidak dapat memuat file atau rakitan 'System.Data.SQLite, Versi = 1.0.61.0, Budaya = netral, PublicKeyToken = db937bc2d44ff139' atau salah satu dari dependensinya. Suatu upaya dilakukan untuk memuat suatu program dengan format yang salah.]
System.Refleksi.Assembly._nLoad (AssemblyName fileName, String codeBase, Bukti perakitan Keamanan, Lokasi perakitanHint, StackCrawlMark & ​​stackMark, Boolean throwOnFileNotFound, Boolean forIntection) +0
System.Refl. .nLoad (Nama file AssemblyName, Kode stringBase, perakitan BuktiKeamanan, lokasi perakitanHint, StackCrawlMark & ​​stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection) +43
System.Reflection.Assembly.InternalLoad (AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark & ​​stackMark, Boolean forIntectionection) +127 System.Reflection.Assembly.InternalLoad (rakitan StringString, perakitan EvidenceSecurity, Stack &tumpukansemua gambar.Penempatan. Load (String assemblyString) +28
System.Web.Configuration.CompilationSection.LoadAssemblyHelper (String assemblyName, Boolean starDirective) +46

[ConfigurationErrorsException: Tidak dapat memuat file atau assembly 'System.Data.SQLite, Versi = 1.0.61.0, Culture = netral, PublicKeyToken = db937bc2d44ff139' atau salah satu dari dependensinya. Suatu upaya dilakukan untuk memuat suatu program dengan format yang salah.]
System.Web.Configuration.CompilationSection.LoadAssemblyHelper (String assemblyName, star BooleanDirective) +613 System.Web.Configuration.CompilationSection.LoadAllAssembliesFromAppDomainBinDonfiguration.203 .CompilationSection.LoadAssembly (AssemblyInfo ai) +105
System.Web.Compilation.BuildManager.Get direferensikanAssemblies (CompilationSection compConfig) +178
System.Web.Compilation.BuildProvidersCompiler..ctor (VirtualPath configPemuatan
System.Web.Compilation.ApplicationBuildProvider.GetGlobalAsaxBuildResult (Boolean isPrecompiledApp) +232
System.Web.Compilation.BuildManager.CompileGlobalAsax () +52 System.Web.Compilation.BuildManager.Engkat Tingkat Tingkat

[HttpException (0x80004005): Tidak dapat memuat file atau assembly 'System.Data.SQLite, Versi = 1.0.61.0, Budaya = netral, PublicKeyToken = db937bc2d44ff139' atau salah satu dari dependensinya. Suatu upaya dilakukan untuk memuat program dengan format yang salah.]
System.Web.Compilation.BuildManager.ReportTopLevelCompilationException () +58 System.Web.Compilation.BuildManager.EnsureTopLevelFilesCompiled () +512 System.Web.Hosting.HostingEnvironmentize ApplicationManager appManager, IApplicationHost appHost, IConfigMapPathFactory configMapPathFactory, HostingEnvironmentParameters hostingParameters) +729

[HttpException (0x80004005): Tidak dapat memuat file atau assembly 'System.Data.SQLite, Versi = 1.0.61.0, Budaya = netral, PublicKeyToken = db937bc2d44ff139' atau salah satu dari dependensinya. Upaya telah dilakukan untuk memuat program dengan format yang salah.]
System.Web.HttpRuntime.FirstRequestInit (konteks HttpContext) +8896783
System.Web.HttpRuntime.EnsureFirstRequestInit (konteks HttpContext) +85
System.Web.HttpRquestRequest ) +259

pupeno
sumber
Log fusi (pengikatan rakitan) jauh lebih berguna dalam kasus seperti ini daripada lembar jejak tumpukan ini.
Anton Tykhyy
1
Tampaknya masalahnya adalah bahwa Cassini adalah x86.
pupeno
Saya memiliki masalah yang sama dan harus meninggalkan ELMAH karena lingkungan produksi / pengembangan campuran yang kami miliki. Mengingat bahwa menggunakan SQLite pada server web produksi traffic tinggi tidak terdengar sangat bagus dan fakta bahwa SQLite dll adalah satu-satunya perakitan di ELMAH yang memaksanya untuk memiliki dua versi berbeda untuk bit x86 dan 64x, saya bertanya-tanya mengapa ELMAH guys menarik dan menjadikannya opsional daripada apa sekarang.
Khash

Jawaban:

122

System.Data.SQLite.dlladalah rakitan campuran, yaitu berisi kode terkelola dan kode asli. Oleh karena itu tertentu System.Data.SQLite.dlladalah x86 atau x64, tetapi tidak pernah keduanya.

Pembaruan ( milik J. Pablo Fernandez ): Cassini, server web pengembangan yang digunakan oleh Visual Studio ketika Anda menekan F5 atau mengklik tombol «play» hijau, hanya x86 yang berarti bahwa bahkan jika workstation Anda x64, Anda hanya akan dapat menggunakan versi x86 dari System.Data.SQLite.dll.

Alternatif lain adalah tidak menggunakan Cassini tetapi IIS7 yang benar x64.

Anton Tykhyy
sumber
3
Saya menggunakan versi x64 di komputer x64.
pupeno
Apakah Anda mencoba menggunakan versi x86?
Anton Tykhyy
2
Alternatif baru yang tersedia beberapa saat yang lalu adalah menggunakan IIS Express yang memungkinkan Anda untuk mengatur jenis kumpulan aplikasi yang ingin Anda gunakan
Raul Vejar
@ Raul Vejar: tolong jelaskan bagaimana fitur pemilihan kumpulan aplikasi IIS Express memecahkan masalah perakitan 32-bit / 64-bit. Terima kasih
Tim
@Tim, fitur itu memungkinkan Anda memilih jenis kumpulan aplikasi yang ingin Anda gunakan, baik 32 atau 64 bit, dengan cara itu Anda dapat mengontrol aspek yang diperbaiki di Cassini dan bekerja dengan pustaka bit yang sama yang Anda miliki. Dengan kata lain, jika Anda menggunakan versi 32 bit dll SQLite, maka Anda harus memilih kumpulan aplikasi 32 bit pada IIS Express. Untuk versi 64 bit perpustakaan Anda harus memilih kumpulan aplikasi 64 bit.
Raul Vejar
77

Pastikan "Enable 32 - Bit Applications" disetel ke false untuk kumpulan aplikasi.

beckelmw
sumber
2
Ini berfungsi jika Anda ingin menggunakan dll x86 pada mesin 64 bit. Dalam kasus kami, lingkungan pengembang dan produksi kami tidak cocok jadi ini yang paling berhasil.
Rob
17
Menetapkannya menjadi benar bagi saya benar-benar menyelesaikan masalah. Saya kira kapal Elmah dengan perakitan 32bit sql lite secara default.
1
+1 untuk @Jirapong dan Sergey karena pengaturan inilah yang harus saya manipulasi agar semuanya berfungsi. Dalam kasus saya, saya pikir saya memiliki versi x86 dari SqlLite DLL dan perlu Aktifkan Aplikasi 32 - Bit agar disetel ke "true."
t3rse
43

Pergi ke IIS7 Application Pool -> advanced settings and set the 32-bit application to true.

umar
sumber
Saya menjalankan windows 7, dan saya mengenai masalah ini; menyalakan 32-bit memperbaikinya bagi saya, mungkin karena salinan DLL saya 32-bit.
Doug
1
FYI: Diperlukan untuk mengatur identitas kumpulan aplikasi ke LocalSystem agar ini berfungsi: ^
Illuminati
Dan pastikan untuk memiliki versi Win32 dari SQLite.Interop.dll stackoverflow.com/questions/4816529/…
Morten Holmgaard
14

Ini sangat sederhana jika Anda tidak menggunakan SQLite:

Anda dapat menghapus SQLite DLL dari folder bin solusi Anda, lalu dari folder tempat Anda mereferensikan ELMAH. Bangun kembali, dan aplikasi Anda tidak akan mencoba memuat DLL ini yang tidak Anda gunakan.

Chris
sumber
5
+1 Jika Anda tidak menggunakan SQLite, lalu mengapa repot-repot memperbaiki DLL yang dirujuk? Bagus, elegan, dan hanya apa yang saya butuhkan.
bhavinb
Ini bekerja secara lokal tetapi saya kemudian mendapatkan kesalahan setelah digunakan untuk Azure.
stuartdotnet
8

Saya memiliki mesin dev 64 bit dan server build 32 bit. Saya menggunakan kode ini sebelum inisialisasi NHibernate. Bekerja pesona pada arsitektur apa pun (baik 2 saya telah diuji)

Semoga ini bisa membantu seseorang.

Guido

        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";
        }
gatapia
sumber
Adakah yang berhasil menggunakan teknik ini? Saya mencobanya dalam solusi aplikasi uji asp.net mvc dan itu tidak berhasil untuk saya.
Glenn
1
Alih-alih pergi ke variabel lingkungan, Anda dapat menggunakan CLR secara langsung: string arch = IntPtr.Size == 8? "x64": "x86";
Jason Morse
2
Atau properti Environment.Is64BitProcess (sejak .NET4).
riezebosch
5

Dalam kasus kami tidak berfungsi karena server produksi kami telah hilang

Paket Redistributable Microsoft Visual C ++ 2010 SP1 (x86)

Kami menginstalnya dan semua berfungsi dengan baik. Application Pool harus mengaktifkan Enable Applications 32-bit menjadi true dan Anda harus versi x86 dari library

Marcos Meli
sumber
1
Bekerja untukku. Itu hanya memberikan pesan kesalahan tanpa menunjukkan pustaka C hilang, yang mengerikan.
brk
1
Bagi saya, saya telah menginstal vcredist 2008 x64 untuk System.Data.SQLite, Version = 1.0.99.0, Budaya = netral, PublicKeyToken = db937bc2d44ff139
themadmax
5

Sebagai seseorang yang harus berurusan dengan beberapa laporan bug tentang Roadkill Wiki dengan masalah yang persis sama, inilah yang perlu Anda lakukan:

  • Apakah Anda menggunakan x64 atau x86? Sqlite hadir dengan DLL untuk arsitektur terpisah - salin yang tepat ke folder tempat Anda, ada dua DLL untuk penyedia resmi:System.Data.SQLite.dll System.Data.SQLite.Linq.dll
  • Jika Anda tidak perlu repot-repot mencari-cari rakitan ini, aktifkan mode 32 bit untuk App Pool Anda (solusi untuk mesin dev biasanya)
  • Jika Anda hosting di server, Anda akan memerlukan Microsoft C ++ Runtime dapat didistribusikan - ini tidak diinstal pada Server 2008 R2 secara default. versi x64 , versi x86

Sangat menyebalkan berapa banyak simpanan yang harus Anda lompati saat mendistribusikan kembali biner .ite SQLite, solusi saya untuk Roadkill pada akhirnya adalah menyalin binari yang benar ke folder ~ / bin berdasarkan arsitektur yang Anda gunakan . Sayangnya itu tidak menyelesaikan masalah runtime C ++.

Chris S
sumber
5

Saya menyelesaikan ini dengan menginstal System.Data.SQLite dengan ekstensi Nuget. Ekstensi ini dapat digunakan untuk Visual Studio 2010 atau lebih tinggi. Pertama, Anda harus menginstal ekstensi Nuget. Anda bisa mengikuti di sini:

  • Pergi ke Visual Studio 2010, Menu -> Tools
  • Pilih Extension Manager
  • Masukkan NuGet di kotak pencarian dan klik Galeri Online. Menunggu itu Ambil informasi ...
  • Pilih Manajer Paket NuGet yang diambil, klik Unduh. Tunggu, Unduh ...
  • Klik Instal pada Penginstal Ekstensi Visual Studio Extension Manager Paket NuGet. Tunggu instalasi selesai.
  • Klik Tutup dan 'Mulai Ulang Sekarang.

Kedua, sekarang, Anda dapat menginstal SQLite:

Dan sekarang, Anda dapat menggunakan System.Data.SQLite.

Dalam kasus ini, Anda melihat dua folder x64 dan, x86, folder ini berisi SQLite.Interop.dll. Sekarang, masuklah ke jendela properti dll itu dan set action build is content dan Salin ke direktori keluaran adalah Salin selalu.

Jadi, itulah caraku.

Terima kasih. Kim Tho Pham, Kota HoChiMinh, Vietnam. Email: [email protected]

Kim Thọ Phạm
sumber
4

Perakitan terkait System.Data.SQLite terkait beban manual dapat menyelesaikan ini.

Mengubah Kode gatapia seperti di bawah ini:

    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";
    }
lxwwqw
sumber
4

Saya mendapatkan kesalahan ini ketika server windows kami dikonversi dari OS 32 bit ke 64 bit. Perakitan yang melempar kesalahan diatur untuk dikompilasi dalam mode x86 (yaitu mode 32). Saya beralih ke "Any CPU" dan itu berhasil. Anda dapat mengubah nilai ini dengan melakukan hal berikut:

klik kanan pada proyek pergi ke Properties -> Build -> Platform Target -> change to "Any CPU"

goku_da_master
sumber
1
Saya mencoba menggunakan 32 bit System.Data.SQLite.dll dan mendapatkan pengecualian ini ketika berjalan pada cpu 64 bit. Saya mengubah target platform dari "Any CPU" ke "x86" dan itu membuat pengecualian hilang. Saya pikir kecuali Anda ingin memaksimalkan kinerja, lebih baik untuk membangun untuk penyebut yang paling tidak umum sehingga harus berjalan pada cpu 32 atau 64 bit.
cdavidyoung
3

Saya menyelesaikan ini, anehnya, dengan menginstal System.Data.SQLite melalui aplikasi GUI Nuget, yang bertentangan dengan konsol manajer paket.

Menginstal melalui konsol tidak menyertakan dependensi yang harus dijalankan oleh perpustakaan ini.

JMK
sumber
3

System.Data.SQLitememiliki ketergantungan pada System.Data.SQLite.interoppastikan kedua paket adalah versi yang sama dan keduanya x86 .

Ini adalah pertanyaan lama, tetapi saya mencoba semua hal di atas. Saya sedang mengerjakan proyek x86 , jadi tidak ada dua folder / x86, / x64. Tetapi untuk beberapa alasan, System.Data.SQLiteitu adalah versi yang berbeda System.Data.SQLite.interop, setelah saya menarik dll yang cocok masalah diperbaiki.

Stacker-flow
sumber
1

Saya datang dengan 2 solusi cepat. Baik bekerja untuk saya. Saya pikir masalahnya adalah karena izin.

1) Alih-alih menggunakan file Elmah.dll dari direktori net-2.0, saya menggunakan Elmah.dll dari net-1.1.

2) Alih-alih menjaga Elmah.dll dalam direktori bin proyek. Saya membuat direktori dll untuk memasukkannya.

Segera
sumber
1

Cara lain untuk menyiasatinya adalah dengan memutakhirkan aplikasi Anda ke ELMAH 1.2 daripada 1.1.

Peter Bernier
sumber
0

Bisakah Anda menghapus folder debug bin Anda dan mengkompilasi ulang lagi?

Atau periksa referensi proyek Anda ke System.Data.SQLite, lacak di mana lokasinya, lalu buka dll di reflektor. Jika Anda tidak dapat membukanya, itu artinya dll rusak, Anda mungkin ingin menemukan yang benar atau menginstal ulang .net framework.

Graviton
sumber
Saya sudah mencoba menambahkan referensi ke System.Data.SQLite secara langsung (selain dari menghapus bin dan obj) dan saya punya kesalahan ini: Galat 1 Peringatan sebagai Galat: Perakitan perakitan - Perakitan yang direferensikan 'System.Data.SQLite.dll '
Menargetkan
0

Jika Anda menggunakan IIS Express sebagai server web pada mesin pengembangan Anda, saya akan berubah menjadi IIS Lokal. Ini berhasil untuk saya.

cyclo_magic
sumber
0

Ini adalah pos lama, tetapi mungkin membantu beberapa orang mencari kesalahan ini untuk mencoba mengatur "Aktifkan Aplikasi 32-Bit" ke True untuk kumpulan aplikasi. Itulah yang mengatasi kesalahan saya. Saya menemukan solusi ini dengan membaca beberapa komentar untuk jawaban @ beckelmw.

MichaelD
sumber
0

Anda mungkin menginstal paket yang salah. Anda menginginkan paket yang diproduksi oleh Microsoft yang mengimplementasikan model penyedia System.Data.Common.

pimbrouwers
sumber