Domanda

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

  

Impossibile caricare il file o l'assembly   'System.Data.SQLite, Version = 1.0.61.0,   Culture = neutral,   PublicKeyToken = db937bc2d44ff139' o   una delle sue dipendenze. Un tentativo   è stato fatto per caricare un programma con un   formato non corretto.

     

Descrizione:   eccezione non gestita durante   l'esecuzione della corrente web   richiesta. Si prega di rivedere l'analisi dello stack   Per ulteriori informazioni sull'errore   e dove ha avuto origine nel codice.

     

Dettagli eccezione:   System.BadImageFormatException: Could   Non caricare file o l'assembly   'System.Data.SQLite, Version = 1.0.61.0,   Culture = neutral,   PublicKeyToken = db937bc2d44ff139' o   una delle sue dipendenze. Un tentativo   è stato fatto per caricare un programma con un   formato non corretto.

Maggiori dettagli errore nella parte inferiore.

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

Ho provato la compilazione per x86 e x64 e ottengo lo stesso errore. Ho provato a rimuovere l'uscita tutta compilatore (bin e obj). Infine ho fatto un riferimento al SQLite dll direttamente, cosa che non era necessario per il progetto di lavorare su server e ho questo errore di compilazione:

  

Errore 1 Avvertenza come errore: generazione Assembly - assemblaggio obiettivi 'System.Data.SQLite.dll' un processore diverso MyProject di riferimento

Tutte le idee che potrebbe essere il problema?

Maggiori dettagli errore:

  

Errore Origine:

     

un'eccezione non gestita è stata generata   durante l'esecuzione della corrente   richiesta web. Le informazioni relative al   origine e la posizione dell'eccezione   può essere identificato tramite l'eccezione   Analisi dello stack di seguito.

     

Analisi dello stack:

     

[BadImageFormatException: Impossibile   file di caricamento o di montaggio   'System.Data.SQLite, Version = 1.0.61.0,   Culture = neutral,   PublicKeyToken = db937bc2d44ff139' o   una delle sue dipendenze. Un tentativo   è stato fatto per caricare un programma con un   formato non corretto.]
  System.Reflection.Assembly._nLoad (AssemblyName   fileName, String codebase, Evidence   assemblySecurity, Assembly   locationHint, StackCrawlMark &   stackMark, booleano   throwOnFileNotFound, booleano   forIntrospection) +0
  System.Reflection.Assembly.nLoad (AssemblyName   fileName, String codebase, Evidence   assemblySecurity, Assembly   locationHint, StackCrawlMark &   stackMark, booleano   throwOnFileNotFound, booleano   forIntrospection) +43
  System.Reflection.Assembly.InternalLoad (AssemblyName   assemblyRef, Evidence   assemblySecurity, StackCrawlMark &   stackMark, booleano forIntrospection)   +127 System.Reflection.Assembly.InternalLoad (String   assemblyString, Evidence   assemblySecurity, StackCrawlMark &   stackMark, booleano forIntrospection)   142 System.Reflection.Assembly.Load (String   assemblyString) +28
  System.Web.Configuration.CompilationSection.LoadAssemblyHelper (String   AssemblyName, booleano starDirective)   46

     

[ConfigurationErrorsException: Could   Non caricare file o l'assembly   'System.Data.SQLite, Version = 1.0.61.0,   Culture = neutral,   PublicKeyToken = db937bc2d44ff139' o   una delle sue dipendenze. Un tentativo   è stato fatto per caricare un programma con un   formato non corretto.]
  System.Web.Configuration.CompilationSection.LoadAssemblyHelper (String   AssemblyName, booleano starDirective)   613 System.Web.Configuration.CompilationSection.LoadAllAssembliesFromAppDomainBinDirectory ()   203 System.Web.Configuration.CompilationSection.LoadAssembly (AssemblyInfo   AI) 105
  System.Web.Compilation.BuildManager.GetReferencedAssemblies (CompilationSection   compConfig) 178
  System.Web.Compilation.BuildProvidersCompiler..ctor (VirtualPath   configpath, booleano   supportLocalization, String   outputAssemblyName) +54
  System.Web.Compilation.ApplicationBuildProvider.GetGlobalAsaxBuildResult (booleano   isPrecompiledApp) 232
  System.Web.Compilation.BuildManager.CompileGlobalAsax ()   +52 System.Web.Compilation.BuildManager.EnsureTopLevelFilesCompiled ()   337

     

[HttpException (0x80004005): Impossibile   file di caricamento o di montaggio   'System.Data.SQLite, Version = 1.0.61.0,   Culture = neutral,   PublicKeyToken = db937bc2d44ff139' o   una delle sue dipendenze. Un tentativo   è stato fatto per caricare un programma con un   formato non corretto.]
  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   file di caricamento o di montaggio   'System.Data.SQLite, Version = 1.0.61.0,   Culture = neutral,   PublicKeyToken = db937bc2d44ff139' o   una delle sue dipendenze. Un tentativo   è stato fatto per caricare un programma con un   formato non corretto.]
  System.Web.HttpRuntime.FirstRequestInit (HttpContext   contesto) +8896783
  System.Web.HttpRuntime.EnsureFirstRequestInit (HttpContext   contesto) +85
  System.Web.HttpRuntime.ProcessRequestInternal (HttpWorkerRequest   wr) 259

È stato utile?

Soluzione

System.Data.SQLite.dll è un gruppo misto, cioè esso contiene sia codice gestito e codice nativo. Pertanto un particolare System.Data.SQLite.dll è x86 o x64, ma mai entrambi.

Aggiorna ( cortesia J. Pablo Fernandez ): Cassini, il server di sviluppo web utilizzato da Visual Studio quando si preme F5 o fare clic sul «gioco» pulsante verde, è solo x86 che significa che, anche se la workstation è x64, sarete solo in grado di utilizzare la versione x86 di System.Data.SQLite.dll.

Un'alternativa non è quella di utilizzare Cassini ma IIS7 che è propriamente x64.

Altri suggerimenti

Assicurarsi che "Enable 32 - Applicazioni Bit". È impostato su false per il pool di app

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

Questo è molto semplice, se non si utilizza SQLite:

È possibile eliminare le DLL SQLite dalle cartelle bin soluzione, poi dalla cartella in cui si fa riferimento ELMAH. Ricostruire, e la vostra applicazione non cercherà di caricare questa DLL che non si sta utilizzando.

Ho una macchina dev 64 bit e server di compilazione a 32 bit. Ho usato questo codice prima di NHibernate inizializzazione. Funziona un fascino su qualsiasi architettura (ben il 2 ho provato)

Spero che questo aiuta 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";
        }

Come qualcuno che ha avuto a che fare con un bel paio di segnalazioni di bug su Roadkill Wiki con esattamente lo stesso problema, questo è quello che devi fare:

  • Si sta utilizzando x64 o x86? SQLite è dotato di DLL per architetture separati - copiare quella giusta per la vostra cartella bin, ci sono due DLL per il fornitore ufficiale: System.Data.SQLite.dll System.Data.SQLite.Linq.dll
  • Se non ve la sentite di caccia in giro per queste assemblee, attivare la modalità a 32 bit per l'App Pool (una soluzione per macchine dev solo di solito)
  • Se si ospitano in un server, è necessario il ridistribuibile Microsoft C ++ Runtime - non è installato sul Server 2008 R2 per impostazione predefinita. x64 versione , versione x86

E 'un vero e proprio dolore nel culo quanti cerchi si deve saltare attraverso quando ri-distribuire i binari SQLite NET, la mia soluzione per Roadkill, alla fine, è stato quello di copiare i file binari corretti nella cartella ~ / bin sulla base del architettura vostro usando. Purtroppo questo non risolve il problema ++ C runtime.

Ho risolto questo con l'installazione di System.Data.SQLite con l'estensione Nuget. Questa estensione può utilizzare per Visual Studio 2010 o superiore. In primo luogo, è necessario installare l'estensione Nuget. È possibile seguire qui:

  • Vai a Visual Studio 2010, Menu -> Strumenti
  • Seleziona Extension Manager
  • Inserisci NuGet nella casella di ricerca e fare clic su Online Gallery. In attesa che Recuperare informazioni ...
  • Selezionare la recuperata NuGet Package Manager, fare clic su Download. In attesa che Download ...
  • Fare clic su Installa sul Visual Studio Extension Installer NuGet Package Manager. Attendere il completamento dell'installazione.
  • Fare clic su Chiudi e 'Riavvia ora.

In secondo luogo, ora, è possibile installare SQLite:

E ora, è possibile utilizzare System.Data.SQLite.

Nel caso, si vedono due x64 cartella e, x86, queste cartelle contengono SQLite.Interop.dll. Ora vai alla proprietà finestre di quelle DLL e impostare l'azione costruttiva è il contenuto e copiare la directory di output è Copia sempre.

Quindi, questo è il mio modo.

Grazie. Kim Tho Pham, Hochiminh City, Vietnam. E-mail: tho.phamkim@gmail.com

Manuale montaggio System.Data.SQLite relative carico può risolvere questo.

di gatapia cambiato codice, 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";
    }

ho ottenuto questo errore quando il nostro server Windows è stato convertito da 32 bit del sistema operativo a 64 bit. Il montaggio particolarmente gettando l'errore è stato impostato per la compilazione in modalità x86 (cioè 32 modalità). Sono passato a "Any CPU" e che ha fatto il trucco. È possibile modificare questo valore facendo quanto segue:

tasto destro del mouse sul progetto vai a Properties -> Build -> Platform Target -> change to "Any CPU"

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

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

L'abbiamo installato e tutto il lavoro bene. Il pool di applicazioni deve avere abilitare le applicazioni a 32 bit impostata su true e si deve la versione x86 di biblioteca

Ho risolto questo, stranamente, installando System.Data.SQLite tramite l'applicazione Nuget GUI, in contrasto con la console di gestione dei pacchetti.

Installazione tramite la console non ha incluso le dipendenze questa libreria bisogno per funzionare.

Sono venuto con 2 soluzioni rapide. O lavorare per me. Credo che il problema è a causa dei permessi.

1) Invece di usare il file Elmah.dll dalla directory net-2.0, che ho usato Elmah.dll dalla rete-1.1.

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

Un altro modo per aggirare il problema è solo quello di aggiornare l'applicazione per ELMAH 1.2 invece di 1.1.

System.Data.SQLite ha una dipendenza da System.Data.SQLite.interop assicurarsi che entrambi i pacchetti sono la stessa versione e sono entrambi 86 .

Questa è una vecchia questione, ma ho provato tutto quanto sopra. Stavo lavorando su un strettamente 86 del progetto, in modo da non c'era due cartelle / 86, / 64. Ma per qualche motivo, il System.Data.SQLite era una versione diversa da System.Data.SQLite.interop, una volta ho tirato giù DLL il problema è stato risolto di corrispondenza.

Si può eliminare la cartella bin di debug e ricompilare di nuovo?

O controllare il progetto riferimento al System.Data.SQLite, rintracciare dove si trova, quindi aprire la dll in riflettore. Se non è possibile aprirlo, ciò significa che il dll è danneggiato, si potrebbe desiderare di trovare un corretto o reinstallare il framework .NET.

Se si utilizza IIS Express come il web server sul computer di sviluppo vorrei cambiare a IIS locale. Questo ha funzionato per me.

Questo è un vecchio post, ma può aiutare alcune persone alla ricerca su questo errore per cercare di impostazione "Attiva applicazioni a 32 bit" a True per il pool di app. Questo è ciò che ha deliberato l'errore per me. Mi sono imbattuto in questa soluzione leggendo alcuni commenti a @ di beckelmw risposta.

È probabile che il pacchetto sbagliato installato. Si desidera che il pacchetto di prodotto da Microsoft che implementa lo System.Data.Common modello di provider.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top