Impossibile caricare il file o l'assembly "System.Data.SQLite"


126

Ho installato ELMAH 1.1 .Net 3.5 x64 nel mio progetto ASP.NET e ora ricevo questo errore (ogni volta che provo a vedere qualsiasi pagina):

Impossibile caricare il file o l'assemblaggio "System.Data.SQLite, Versione = 1.0.61.0, Culture = neutral, PublicKeyToken = db937bc2d44ff139" o una delle sue dipendenze. Tentativo di caricare un programma con un formato errato.

Descrizione: si è verificata un'eccezione non gestita durante l'esecuzione della richiesta Web corrente. Esaminare la traccia dello stack per ulteriori informazioni sull'errore e sulla sua origine nel codice.

Dettagli eccezione: System.BadImageFormatException: impossibile caricare il file o l'assembly 'System.Data.SQLite, Versione = 1.0.61.0, Culture = neutral, PublicKeyToken = db937bc2d44ff139' o una delle sue dipendenze. Tentativo di caricare un programma con un formato errato.

Ulteriori dettagli sull'errore in fondo.

La mia piattaforma di soluzione attiva è "Any CPU" e sono in esecuzione su un Windows 7 x64 su un processore x64, ovviamente. Il motivo per cui stiamo usando questa versione di ELMAH è perché 1.0 .Net 3.5 (x86, che è l'unica piattaforma per la quale è compilato) ci ha dato lo stesso errore sul nostro server Windows x64.

Ho provato a compilare per x86 e x64 e ottengo lo stesso errore. Ho provato a rimuovere tutto l'output del compilatore (bin e obj). Finalmente ho fatto un riferimento direttamente alla dll SQLite, qualcosa che non era necessario per il funzionamento del progetto sul server e ho questo errore del compilatore:

Errore 1 Avviso come errore: Generazione di assembly - L'assembly di riferimento "System.Data.SQLite.dll" è destinato a un processore MyProject diverso

Qualche idea su quale potrebbe essere il problema?

Maggiori dettagli sull'errore:

Errore sorgente:

È stata generata un'eccezione non gestita durante l'esecuzione della richiesta Web corrente. Le informazioni relative all'origine e alla posizione dell'eccezione possono essere identificate utilizzando la traccia dello stack delle eccezioni riportata di seguito.

Stack Trace:

[BadImageFormatException: impossibile caricare il file o l'assembly 'System.Data.SQLite, Versione = 1.0.61.0, Culture = neutral, PublicKeyToken = db937bc2d44ff139' o una delle sue dipendenze. È stato effettuato un tentativo di caricare un programma con un formato errato.]
System.Reflection.Assembly._nLoad (AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark & ​​stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection) +0
System.Reflection.A .nLoad (AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly assembly Suggerimento, 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. Load (String assemblyString) +28
System.Web.Configuration.CompilationSection.LoadAssemblyHelper (String assemblyName, Boolean starDirective) +46

[ConfigurationErrorsException: impossibile caricare il file o l'assembly 'System.Data.SQLite, Versione = 1.0.61.0, Culture = neutral, PublicKeyToken = db937bc2d44ff139' o una delle sue dipendenze. Tentativo di caricare un programma con un formato errato.]
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 outputAssembly)
System.Web.Compilation.ApplicationBuildProvider.GetGlobalAsaxBuildResult (Boolean isPrecompiledApp) +232
System.Web.Compilation.BuildManager.CompileGlobalAsax () +52 System.Web.Compilation.BuildManager.EnsureTopLevelFilesCompilate

[HttpException (0x80004005): Impossibile caricare il file o l'assembly 'System.Data.SQLite, Versione = 1.0.61.0, Culture = neutral, PublicKeyToken = db937bc2d44ff139' o una delle sue dipendenze. Tentativo di caricare un programma con un formato errato.]
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): Impossibile caricare il file o l'assembly 'System.Data.SQLite, Versione = 1.0.61.0, Culture = neutral, PublicKeyToken = db937bc2d44ff139' o una delle sue dipendenze. Tentativo di caricare un programma con un formato errato.]
System.Web.HttpRuntime.FirstRequestInit (contesto HttpContext) +8896783
System.Web.HttpRuntime.EnsureFirstRequestInit (contesto HttpContext) +85
System.Web.HttpRuntime.ProcessRequestInest (HttpWork ) +259


Un registro Fusion (assembly binding) è molto più utile in questi casi rispetto a questo foglio di una traccia dello stack.
Anton Tykhyy,

1
Sembra che il problema sia che Cassini è x86.
pupeno,

Ho avuto lo stesso problema e ho dovuto abbandonare ELMAH a causa del misto ambiente di produzione / sviluppo che abbiamo. Dato che l'utilizzo di SQLite su un server Web di produzione ad alto traffico non suona molto bene e il fatto che SQLite DLL sia l'unico assembly in ELMAH che lo costringe ad avere due diverse versioni per bit x86 e 64x, mi chiedo perché i ragazzi ELMAH tirino fuori e renderlo facoltativo piuttosto che quello che è ora.
Khash,

Risposte:


122

System.Data.SQLite.dllè un assembly misto, ovvero contiene sia codice gestito che codice nativo. Pertanto un particolare System.Data.SQLite.dllè x86 o x64, ma mai entrambi.

Aggiornamento (per gentile concessione di J. Pablo Fernandez ): Cassini, il web server di sviluppo utilizzato da Visual Studio quando si preme F5 o si fa clic sul pulsante verde "Riproduci", è solo x86, il che significa che anche se la workstation è x64, si sarà solo in grado di utilizzare la versione x86 di System.Data.SQLite.dll.

Un'alternativa non è usare Cassini ma IIS7 che è correttamente x64.


3
Sto usando la versione x64 su un computer x64.
pupeno,

Hai provato a utilizzare la versione x86?
Anton Tykhyy,

2
Una nuova alternativa che sarà disponibile poco fa è usare IIS Express che ti consente di impostare il tipo di pool di applicazioni che vuoi usare
Raul Vejar

@Raul Vejar: approfondisci come la funzione di selezione del pool di applicazioni di IIS Express risolve il problema dell'assembly a 32-bit / 64-bit. Grazie
Tim

@Tim, quella funzione ti consente di selezionare il tipo di pool di applicazioni che vuoi usare, a 32 o 64 bit, in questo modo puoi controllare quell'aspetto che è stato corretto in Cassini e lavorare con la stessa libreria di bit che hai. In altre parole, se si utilizza la versione a 32 bit della dll SQLite, è necessario selezionare il pool di applicazioni a 32 bit su IIS Express. Per la versione a 64 bit della libreria è necessario selezionare il pool di applicazioni a 64 bit.
Raul Vejar,

77

Assicurati che "Abilita applicazioni a 32 bit" sia impostato su false per il pool di app.


2
Funziona se vuoi usare la dll x86 su una macchina a 64 bit. Nel nostro caso, i nostri ambienti di sviluppo e produzione non coincidono, quindi questo è ciò che ha funzionato meglio.
Rob,

17
L'impostazione su true per me ha effettivamente risolto il problema. Immagino che Elmah sia fornita di default con l'assemblaggio sql lite a 32 bit.

1
+1 sia per @Jirapong che per Sergey perché era questa impostazione che ho dovuto manipolare per far funzionare le cose. Nel mio caso penso di avere la versione x86 della DLL SqlLite e di aver bisogno di abilitare le applicazioni a 32 bit per essere impostato su "true".
3

43

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


Sto eseguendo Windows 7 e ho riscontrato questo problema; l'attivazione a 32 bit l'ha risolto per me, presumibilmente perché la mia copia della DLL era a 32 bit.
Doug

1
FYI: È stato necessario impostare l'identità del pool di applicazioni su LocalSystem per farlo funzionare: ^
Illuminati,

E assicurarsi di avere una versione Win32 del SQLite.Interop.dll stackoverflow.com/questions/4816529/...
Morten Holmgaard

14

Questo è molto semplice se non si utilizza SQLite:

È possibile eliminare le DLL di SQLite dalle cartelle bin della soluzione, quindi dalla cartella in cui si fa riferimento a ELMAH. Ricostruisci e la tua app non proverà a caricare questa DLL che non stai utilizzando.


5
+1 Se non si utilizza SQLite, perché preoccuparsi di correggere la DLL di riferimento? Bello, elegante e proprio quello di cui avevo bisogno.
bhavinb,

Questo ha funzionato localmente ma ho ricevuto l'errore dopo la distribuzione in Azure.
stuartdotnet,

8

Ho una macchina di sviluppo a 64 bit e un server di build a 32 bit. Ho usato questo codice prima dell'inizializzazione di NHibernate. Fa incantare qualsiasi architettura (bene il 2 che ho testato)

Spero che questo aiuti qualcuno.

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

Qualcuno ha usato con successo questa tecnica? L'ho provato in una soluzione di app ASP.net mvc test e non ha funzionato per me.
Glenn,

1
Invece di passare alla variabile d'ambiente, è possibile utilizzare direttamente CLR: string arch = IntPtr.Size == 8? "x64": "x86";
Jason Morse,

2
O la proprietà Environment.Is64BitProcess (da .NET4).
riezebosch,

5

Nel nostro caso non ha funzionato perché manca il nostro server di produzione

Pacchetto ridistribuibile di Microsoft Visual C ++ 2010 SP1 (x86)

L'abbiamo installato e tutto funziona bene. Il pool di applicazioni deve avere Abilita applicazioni a 32 bit impostato su true ed è necessario disporre della versione x86 della libreria


1
Per me va bene. Fornisce solo un messaggio di errore senza indicare che manca la libreria C, il che è terribile.
brk

1
Per me ho installato vcredist 2008 x64 per System.Data.SQLite, Versione = 1.0.99.0, Culture = neutral, PublicKeyToken = db937bc2d44ff139
themadmax

5

Dato che qualcuno che ha dovuto gestire parecchi bug report su Roadkill Wiki con lo stesso problema, questo è ciò che devi fare:

  • Stai usando x64 o x86? Sqlite include DLL per architetture separate: copia quella giusta nella cartella bin, ci sono due DLL per il provider ufficiale:System.Data.SQLite.dll System.Data.SQLite.Linq.dll
  • Se non puoi preoccuparti di cercare questi assembly, abilita la modalità a 32 bit per il tuo pool di app (una soluzione per le macchine di sviluppo solo di solito)
  • Se si esegue l'hosting su un server, è necessario ridistribuibile Microsoft C ++ Runtime: non è installato su Server 2008 R2 per impostazione predefinita. versione x64 , versione x86

È un vero dolore nel culo quanti cerchi devi saltare quando ridistribuisci i binari di SQLite .NET, la mia soluzione per Roadkill alla fine era copiare i binari corretti nella cartella ~ / bin in base all'architettura che stai usando . Purtroppo questo non risolve il problema di runtime C ++.


5

Ho risolto questo problema installando System.Data.SQLite con estensione Nuget. Questa estensione può essere utilizzata per Visual Studio 2010 o versione successiva. Innanzitutto, devi installare l'estensione Nuget. Puoi seguire qui:

  • Vai a Visual Studio 2010, Menu -> Strumenti
  • Seleziona Extension Manager
  • Immettere NuGet nella casella di ricerca e fare clic su Galleria online. In attesa Recupera informazioni ...
  • Selezionare il gestore pacchetti NuGet recuperato, fare clic su Download. Aspettandolo Scarica ...
  • Fare clic su Installa sul gestore pacchetti NuGet del programma di installazione estensione di Visual Studio. Attendere il completamento dell'installazione.
  • Fai clic su Chiudi e 'Riavvia ora.

Secondo, ora puoi installare SQLite:

E ora puoi usare System.Data.SQLite.

Nel caso, vedi due cartelle x64 e, x86, queste cartelle contengono SQLite.Interop.dll. Ora vai alle finestre delle proprietà di quelle dll e imposta l'azione di compilazione è contenuto e Copia nella directory di output è Copia sempre.

Quindi, questo è il mio modo.

Grazie. Kim Tho Pham, Ho Chi Minh City, Vietnam. Email: tho.phamkim@gmail.com


4

L'assemblaggio System.Data.SQLite relativo al carico manuale può risolvere questo problema.

Codice di gatapia modificato come di seguito:

    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

Ho riscontrato questo errore quando il nostro server Windows è stato convertito da un sistema operativo a 32 bit a 64 bit. L'assembly che stava generando l'errore era impostato per essere compilato in modalità x86 (ovvero in modalità 32). L'ho passato a "Any CPU" e questo ha funzionato. È possibile modificare questo valore procedendo come segue:

fare clic destro sul progetto vai a Properties -> Build -> Platform Target -> change to "Any CPU"


1
Stavo cercando di utilizzare System.Data.SQLite.dll a 32 bit e ottenendo questa eccezione durante l'esecuzione su CPU a 64 bit. Ho cambiato il target della piattaforma da "Any CPU" a "x86" e ha fatto sparire l'eccezione. Immagino che a meno che tu non stia cercando di massimizzare le prestazioni, è meglio costruire per il minimo comune denominatore in modo che dovrebbe funzionare su una CPU a 32 o 64 bit.
cdavidyoung,

3

Ho risolto questo, stranamente, installando System.Data.SQLite tramite l'applicazione GUI di Nuget, al contrario della console di gestione dei pacchetti.

L'installazione tramite console non includeva le dipendenze che questa libreria deve eseguire.


3

System.Data.SQLitedipende da System.Data.SQLite.interopassicurarsi che entrambi i pacchetti abbiano la stessa versione e siano entrambi x86 .

Questa è una vecchia domanda, ma ho provato tutto quanto sopra. Stavo lavorando su un progetto strettamente x86 , quindi non c'erano due cartelle / x86, / x64. Ma per qualche ragione, System.Data.SQLiteera una versione diversa da quella System.Data.SQLite.interop, una volta abbattuta le corrispondenti DLL il problema era stato risolto.


1

Ho escogitato 2 soluzioni rapide. O lavora per me. Penso che il problema sia dovuto alle autorizzazioni.

1) Invece di utilizzare il file Elmah.dll dalla directory net-2.0, ho usato Elmah.dll da net-1.1.

2) Invece di mantenere Elmah.dll nella directory bin del progetto. Faccio una directory dll per inserirlo.


1

Un altro modo per aggirare questo problema è semplicemente aggiornare l'applicazione a ELMAH 1.2 anziché a 1.1.


0

È possibile eliminare la cartella di debug del bin e ricompilare di nuovo?

Oppure controlla il riferimento del tuo progetto a System.Data.SQLite, rintraccia dove si trova, quindi apri la dll nel riflettore. Se non è possibile aprirlo, ciò significa che la DLL è danneggiata, è possibile trovarne una corretta o reinstallare il framework .net.


Ho provato ad aggiungere direttamente il riferimento a System.Data.SQLite (oltre a rimuovere bin e obj) e ho riscontrato questo errore: Errore 1 Avviso come errore: Generazione di assiemi - System.Data.SQLite.dll di assembly di riferimento "
prende di

0

Se si utilizza IIS Express come server Web sulla propria macchina di sviluppo, cambierei in IIS locale. Questo ha funzionato per me.


0

Questo è un vecchio post, ma può aiutare alcune persone a cercare questo errore per provare a impostare "Abilita applicazioni a 32 bit" su True per il pool di app. Questo è ciò che ha risolto l'errore per me. Ho trovato questa soluzione leggendo alcuni commenti alla risposta di @ beckelmw.


0

Probabilmente hai installato il pacchetto sbagliato. Si desidera il pacchetto prodotto da Microsoft che implementa il modello del provider System.Data.Common.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.