'System.Data.SQLite' dosyası veya derlemesi yüklenemedi


126

ASP.NET projeme ELMAH 1.1 .Net 3.5 x64 yükledim ve şimdi bu hatayı alıyorum (herhangi bir sayfayı görmeye çalıştığımda):

Dosya veya derleme 'System.Data.SQLite, Sürüm = 1.0.61.0, Culture = nötr, PublicKeyToken = db937bc2d44ff139' veya bağımlılıklarından biri yüklenemedi. Yanlış biçime sahip bir program yüklenmeye çalışıldı.

Açıklama: Mevcut web isteğinin yürütülmesi sırasında işlenmeyen bir istisna oluştu. Hata ve kodda nereden kaynaklandığı hakkında daha fazla bilgi için lütfen yığın izlemeyi inceleyin.

Özel Durum Ayrıntıları: System.BadImageFormatException: Dosya veya derleme 'System.Data.SQLite, Sürüm = 1.0.61.0, Culture = nötr, PublicKeyToken = db937bc2d44ff139' veya bağımlılıklarından biri yüklenemedi. Yanlış biçime sahip bir program yüklenmeye çalışıldı.

Alt kısımda daha fazla hata detayı.

Aktif Çözüm platformum "Herhangi bir CPU" ve bir x64, tabii ki işlemci üzerinde bir x64 Windows 7 üzerinde çalışıyorum. ELMAH'ın bu sürümünü kullanmamızın nedeni, 1.0 .Net 3.5'in (derlendiği tek platform olan x86) bize aynı hatayı x64 Windows sunucumuzda vermesidir.

X86 ve x64 için derlemeyi denedim ve aynı hatayı alıyorum. Tüm derleyici çıktılarını (bin ve obj) kaldırmayı denedim. Son olarak SQLite dll'ye doğrudan bir referans yaptım, projenin sunucuda çalışması için gerekli olmayan bir şey ve şu derleyici hatası aldım:

Hata 1 Hata Olarak Uyarı: Derleme üretimi - Başvurulan derleme 'System.Data.SQLite.dll' farklı bir işlemci MyProject'i hedefliyor

Sorunun ne olabileceği hakkında bir fikriniz var mı?

Daha fazla hata ayrıntısı:

Kaynak Hatası:

Mevcut web talebinin yürütülmesi sırasında işlenmeyen bir istisna oluşturuldu. İstisnanın kaynağı ve konumu ile ilgili bilgiler, aşağıdaki istisna yığını izlemesi kullanılarak belirlenebilir.

Yığın izleme:

[BadImageFormatException: 'System.Data.SQLite, Version = 1.0.61.0, Culture = nötr, PublicKeyToken = db937bc2d44ff139' veya bağımlılıklarından biri dosyası veya derlemesi yüklenemedi. Yanlış biçime sahip bir program yükleme girişiminde bulunuldu.]
System.Reflection.Assembly._nLoad (AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark & ​​stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection) +0
System.Reflection.Assembly .nLoad (AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark & ​​stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection) +43
System.Reflection.Assembly.InternalLoad (AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark & ​​stackMark, Boolean forIntrospection) +127 System.Reflection.Assembly.InternalLoad (String assemblyString, Evidence assemblySecurity, StackCrawlMark ve stackMark, Boolean için. Load (String assemblyString) +28
System.Web.Configuration.CompilationSection.LoadAssemblyHelper (String assemblyName, Boolean starDirective) +46

[ConfigurationErrorsException: 'System.Data.SQLite, Sürüm = 1.0.61.0, Culture = nötr, PublicKeyToken = db937bc2d44ff139' veya bağımlılıklarından biri dosyası veya derlemesi yüklenemedi. Yanlış biçime sahip bir programı yükleme girişiminde bulunuldu.]
System.Web.Configuration.CompilationSection.LoadAssemblyHelper (String assemblyName, Boolean starDirective) +613 System.Web.Configuration.CompilationSection.LoadAllAssembliesFromAppDomainBinDirectory () +203 System.Web. .CompilationSection.LoadAssembly (AssemblyInfo ai) +105
System.Web.Compilation.BuildManager.GetReferencedAssemblies (CompilationSection compConfig) +178
System.Web.Compilation.BuildProvidersCompiler..ctor (VirtualPath configPath, Boolean supportLocalization, String outputAembly
System.Web.Compilation.ApplicationBuildProvider.GetGlobalAsaxBuildResult (Boolean isPrecompiledApp) +232
System.Web.Compilation.BuildManager.CompileGlobalAsax () +52 System.Web.Compilation.BuildManager.EnsureTopLevelFiles () +337Compiled ()

[HttpException (0x80004005): Dosya veya 'System.Data.SQLite, Sürüm = 1.0.61.0, Kültür = nötr, PublicKeyToken = db937bc2d44ff139' veya bağımlılıklarından biri yüklenemedi. Yanlış biçime sahip bir program yükleme girişiminde bulunuldu.]
System.Web.Compilation.BuildManager.ReportTopLevelCompilationException () +58 System.Web.Compilation.BuildManager.EnsureTopLevelFilesCompiled () +512 System.Web.Hosting.HostingEnvironment.Initialize ( ApplicationManager appManager, IApplicationHost appHost, IConfigMapPathFactory configMapPathFactory, HostingEnvironmentParameters hostingParameters) +729

[HttpException (0x80004005): Dosya veya 'System.Data.SQLite, Sürüm = 1.0.61.0, Kültür = nötr, PublicKeyToken = db937bc2d44ff139' veya bağımlılıklarından biri yüklenemedi. Yanlış biçime sahip bir programı yükleme girişiminde bulunuldu.]
System.Web.HttpRuntime.FirstRequestInit (HttpContext bağlamı) +8896783
System.Web.HttpRuntime.EnsureFirstRequestInit (HttpContext bağlamı) +85
System.Web.HttpRuntime.ProcessRequestInternal ( ) +259


Bu tür durumlarda, bir Füzyon (derleme bağlama) günlüğü, bu yığın izleme sayfasından çok daha kullanışlıdır.
Anton Tykhyy

1
Görünüşe göre sorun Cassini'nin x86 olmasıydı.
pupeno

Aynı sorunu yaşadım ve sahip olduğumuz karma üretim / geliştirme ortamı nedeniyle ELMAH'ı terk etmek zorunda kaldım. Yüksek trafikli bir üretim web sunucusunda SQLite kullanmanın kulağa pek iyi gelmediği ve SQLite dll'nin ELMAH'da x86 ve 64x bitler için iki farklı versiyona sahip olmaya zorlayan tek montaj olduğu gerçeği göz önüne alındığında, ELMAH adamlarının neden çektiğini merak ediyorum. dışarı çıkar ve şimdi olduğundan çok isteğe bağlı hale getirir.
Khash

Yanıtlar:


122

System.Data.SQLite.dllkarma bir derlemedir, yani hem yönetilen kodu hem de yerel kodu içerir. Bu nedenle belirli bir System.Data.SQLite.dllx86 veya x64'tür, ancak ikisi birden olamaz.

Güncelleme ( J. Pablo Fernandez'in izniyle ): F5'e bastığınızda veya yeşil «oynat» düğmesine tıkladığınızda Visual Studio tarafından kullanılan geliştirme web sunucusu Cassini yalnızca x86'dır; bu, iş istasyonunuz x64 olsa bile, yalnızca System.Data.SQLite.dll'nin x86 sürümünü kullanabilir.

Bir alternatif, Cassini'yi değil, x64 olan IIS7'yi kullanmaktır.


3
Bir x64 bilgisayarda x64 sürümünü kullanıyorum.
pupeno

X86 sürümünü kullanmayı denediniz mi?
Anton Tykhyy

2
Kısa bir süre önce kullanıma sunulan yeni bir alternatif, kullanmak istediğiniz uygulama havuzu türünü ayarlamanıza izin veren IIS Express'i kullanmaktır
Raul Vejar,

@Raul Vejar: Lütfen IIS Express'in uygulama havuzu seçme özelliğinin 32 bit / 64 bit montaj sorununu nasıl çözdüğünü açıklayın. Teşekkürler
Tim

@Tim, bu özellik, 32 veya 64 bit kullanmak istediğiniz uygulama havuzu türünü seçmenize olanak tanır, böylece Cassini'de düzeltilen yönü kontrol edebilir ve sahip olduğunuz aynı bit kitaplığıyla çalışabilirsiniz. Diğer bir deyişle, SQLite dll'nin 32 bit sürümünü kullanıyorsanız, IIS Express üzerinde 32 bit uygulama havuzunu seçmelisiniz. Kitaplığın 64 bit sürümü için 64 bit uygulama havuzunu seçmelisiniz.
Raul Vejar

77

Uygulama havuzu için "32 Bit Uygulamaları Etkinleştir" seçeneğinin yanlış olarak ayarlandığından emin olun.


2
Bu, x86 dll'yi 64 bit makinede kullanmak istiyorsanız çalışır. Bizim durumumuzda, geliştirme ve üretim ortamlarımız eşleşmiyor, bu yüzden en iyi sonuç veren şey buydu.
Rob

17
Bunu benim için doğru olarak ayarlamak aslında sorunu çözdü. Sanırım Elmah varsayılan olarak 32bit sql lite derlemesiyle birlikte geliyor.

1
Hem @Jirapong hem de Sergey için +1, çünkü işleri yürütmek için manipüle etmem gereken bu ayardı. Benim durumumda, SqlLite DLL'nin x86 sürümüne sahip olduğumu ve 32-Bit Uygulamaların "true" olarak ayarlanmasına ihtiyacım olduğunu düşünüyorum.
t3rse

43

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


Windows 7 çalıştırıyorum ve bu soruna çarptım; 32-bit'i açmak benim için düzeltildi, çünkü muhtemelen DLL kopyam 32-bitti.
Doug

1
Bilginize: Bunun çalışması için uygulama havuzu kimliğinin LocalSystem olarak ayarlanması gerekiyordu: ^
Illuminati


14

SQLite kullanmıyorsanız bu çok basit:

SQLite DLL'lerini çözümünüzün bin klasörlerinden, ardından ELMAH'a başvurduğunuz klasörden silebilirsiniz. Yeniden oluşturduğunuzda, uygulamanız kullanmadığınız bu DLL dosyasını yüklemeye çalışmayacaktır.


5
+1 SQLite kullanmıyorsanız, neden başvurulan DLL dosyasını düzeltmeye çalışasınız ki? Güzel, zarif ve tam da ihtiyacım olan şey.
bhavinb

Bu yerel olarak çalıştı, ancak Azure'a dağıttıktan sonra hatayı aldım.
stuartdotnet

8

64 bit dev makinem ve 32 bit derleme sunucum var. Bu kodu NHibernate başlatmadan önce kullandım. Herhangi bir mimaride bir cazibe çalışması (test ettiğim 2)

Umarım bu birine yardımcı olur.

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";
        }

Bu tekniği başarıyla kullanan var mı? Bir test asp.net mvc uygulama çözümünde denedim ve benim için işe yaramadı.
Glenn

1
Ortam değişkenine gitmek yerine, CLR'yi doğrudan kullanabilirsiniz: string arch = IntPtr.Size == 8? "x64": "x86";
Jason Morse

2
Veya Environment.Is64BitProcess özelliği (.NET4'ten beri).
riezebosch

5

Bizim durumumuzda çalışmadı çünkü üretim sunucumuz eksik

Microsoft Visual C ++ 2010 SP1 Yeniden Dağıtılabilir Paketi (x86)

Onu kurduk ve her şey yolunda. Uygulama Havuzunda 32-bit Uygulamaları Etkinleştir doğru olarak ayarlanmış olmalı ve kitaplığın x86 sürümünü kullanmalısınız


1
Benim için çalışıyor. Sadece C kütüphanesinin eksik olduğunu göstermeden bir hata mesajı veriyor, bu korkunç.
brk

1
Benim için System.Data.SQLite için vcredist 2008 x64, Version = 1.0.99.0, Culture = nötr, PublicKeyToken = db937bc2d44ff139
themadmax

5

Roadkill Wiki'de tamamen aynı sorunla ilgili birkaç hata raporu ile uğraşmak zorunda kalan biri olarak yapmanız gereken şey bu:

  • X64 veya x86 mı kullanıyorsunuz? Sqlite, ayrı mimariler için DLL'lerle birlikte gelir - doğru olanı bin klasörünüze kopyalayın, resmi sağlayıcı için iki DLLS vardır:System.Data.SQLite.dll System.Data.SQLite.Linq.dll
  • Bu derlemeleri aramaktan rahatsız olmuyorsanız, Uygulama Havuzunuz için 32 bit modunu etkinleştirin (genellikle yalnızca geliştirme makineleri için bir çözüm)
  • Bir sunucuda barındırıyorsanız, Microsoft C ++ Runtime yeniden dağıtılabilirine ihtiyacınız olacaktır - varsayılan olarak Server 2008 R2 üzerine kurulu değildir. x64 sürümü , x86 sürümü

SQLite .NET ikili dosyalarını yeniden dağıtırken kaç çemberden geçmek zorunda olduğunuz gerçek bir acı, sonunda Roadkill için çözümüm, kullandığınız mimariye bağlı olarak doğru ikili dosyaları ~ / bin klasörüne kopyalamaktı. . Ne yazık ki bu, C ++ çalışma zamanı sorununu çözmez.


5

Bunu, Nuget uzantısı ile System.Data.SQLite'ı kurarak çözdüm. Bu uzantı, Visual Studio 2010 veya üstü için kullanılabilir. Öncelikle Nuget eklentisini kurmanız gerekiyor. Buradan takip edebilirsiniz:

  • Visual Studio 2010'a gidin, Menü -> Araçlar
  • Extension Manager'ı seçin
  • Arama kutusuna NuGet yazın ve Çevrimiçi Galeri'ye tıklayın. Bekleniyor Bilgi al…
  • Alınan NuGet Paket Yöneticisini seçin, İndir'e tıklayın. İndirme bekleniyor…
  • Visual Studio Extension Installer NuGet Paket Yöneticisi'nde Yükle'ye tıklayın. Kurulumun tamamlanmasını bekleyin.
  • Kapat'ı ve 'Şimdi Yeniden Başlat'ı tıklayın.

İkincisi, şimdi SQLite'ı kurabilirsiniz:

Ve şimdi System.Data.SQLite'ı kullanabilirsiniz.

Bu durumda, iki klasör x64 görürsünüz ve x86, bu klasörler SQLite.Interop.dll içerir. Şimdi bu dll'lerin özellikler penceresine gidin ve derleme eylemini içerik olarak ayarlayın ve Çıktı dizinine kopyala her zaman Kopyala olur.

Yani benim yolum bu.

Teşekkürler. Kim Tho Pham, HoChiMinh Şehri, Vietnam. Eposta: tho.phamkim@gmail.com


4

Manuel yüklemeyle ilgili System.Data.SQLite derlemesi bu sorunu çözebilir.

Gatapia'nın Kodu aşağıdaki gibi değiştirildi:

    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 sunucumuz 32 bit işletim sisteminden 64 bit'e dönüştürüldüğünde bu hatayı aldım. Hatayı atan derleme x86 kipinde (yani 32 kipte) derlenecek şekilde ayarlandı. "Herhangi bir CPU" olarak değiştirdim ve bu hile yaptı. Aşağıdakileri yaparak bu değeri değiştirebilirsiniz:

projeye sağ tıkla git Properties -> Build -> Platform Target -> change to "Any CPU"


1
32 bit System.Data.SQLite.dll kullanmaya ve 64 bit cpu üzerinde çalışırken bu istisnayı almaya çalışıyordum. Platform hedefini "Herhangi bir CPU" dan "x86" olarak değiştirdim ve bu istisnayı ortadan kaldırdı. Performansı en üst düzeye çıkarmak istemiyorsanız, 32 veya 64 bitlik bir işlemci üzerinde çalışması için en az ortak payda için derlemenin daha iyi olacağını düşünüyorum.
cdavidyoung

3

Bunu, garip bir şekilde, paket yöneticisi konsolunun aksine Nuget GUI uygulaması aracılığıyla System.Data.SQLite'ı yükleyerek çözdüm.

Konsol aracılığıyla yükleme, bu kitaplığın çalıştırması gereken bağımlılıkları içermiyordu.


3

System.Data.SQLiteSystem.Data.SQLite.interopHer iki paketin de aynı sürüm olduğundan ve her ikisinin de x86 olduğundan emin olmak için bir bağımlılığı vardır .

Bu eski bir soru, ama yukarıdakilerin hepsini denedim. Kesinlikle bir x86 projesi üzerinde çalışıyordum , bu yüzden iki klasör / x86, / x64 yoktu. Ancak bazı nedenlerden dolayı, System.Data.SQLitefarklı bir System.Data.SQLite.interopsürümdü, eşleşen dll'leri aşağı çektiğimde sorun çözüldü.


1

2 hızlı çözüm buldum. Ya benim için çalış. Sanırım sorunun nedeni izinler.

1) Net-2.0 dizinindeki Elmah.dll dosyasını kullanmak yerine net-1.1'deki Elmah.dll dosyasını kullandım.

2) Elmah.dll dosyasını proje bin dizininde tutmak yerine. Yerleştirmek için bir dll dizini oluşturuyorum.


1

Bunu aşmanın başka bir yolu da uygulamanızı 1.1 yerine ELMAH 1.2'ye yükseltmektir.


0

Bin hata ayıklama klasörünüzü silip yeniden derleyebilir misiniz?

Veya proje referansınızı kontrol edin System.Data.SQLite, bulunduğu yeri takip edin, ardından reflektördeki dll'yi açın. Açamıyorsanız, bu, dll'nin bozuk olduğu anlamına gelir, doğru bir tane bulmak veya .net çerçevesini yeniden yüklemek isteyebilirsiniz.


System.Data.SQLite başvurusunu doğrudan eklemeyi denedim (bin ve obj'i kaldırmanın yanı sıra) ve şu hatayı aldım: Hata 1 Hata Olarak Uyarı: Derleme üretimi - Başvurulan derleme 'System.Data.SQLite.dll 'farklı bir işlemci MyProject'i hedefliyor
pupeno

0

Geliştirme makinenizde web sunucusu olarak IIS Express kullanıyorsanız, Yerel IIS olarak değiştiririm. Bu benim için çalıştı.


0

Bu eski bir gönderidir, ancak bu hatayı arayan bazı kişilerin uygulama havuzu için "32-Bit Uygulamaları Etkinleştir" seçeneğini True olarak ayarlamayı denemelerine yardımcı olabilir. Benim için hatayı çözen buydu. Bu çözüme, @ beckelmw'nin cevabına yapılan bazı yorumları okuyarak geldim.


0

Muhtemelen yanlış paket yüklemişsinizdir. System.Data.Common sağlayıcı modelini uygulayan Microsoft tarafından üretilen paketi istiyorsunuz .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.