Impossible de charger le fichier ou l'assembly 'System.Data.SQLite'

126

J'ai installé ELMAH 1.1 .Net 3.5 x64 dans mon projet ASP.NET et maintenant j'obtiens cette erreur (chaque fois que j'essaye de voir une page):

Impossible de charger le fichier ou l'assembly 'System.Data.SQLite, Version = 1.0.61.0, Culture = neutral, PublicKeyToken = db937bc2d44ff139' ou l'une de ses dépendances. Une tentative a été faite pour charger un programme avec un format incorrect.

Description: une exception non gérée s'est produite lors de l'exécution de la requête Web actuelle. Veuillez consulter la trace de la pile pour plus d'informations sur l'erreur et son origine dans le code.

Détails de l'exception: System.BadImageFormatException: impossible de charger le fichier ou l'assembly 'System.Data.SQLite, Version = 1.0.61.0, Culture = neutral, PublicKeyToken = db937bc2d44ff139' ou l'une de ses dépendances. Une tentative a été faite pour charger un programme avec un format incorrect.

Plus de détails sur l'erreur en bas.

Ma plate-forme Active Solution est "Any CPU" et j'exécute sur un x64 Windows 7 sur un x64, bien sûr, un processeur. La raison pour laquelle nous utilisons cette version d'ELMAH est que 1.0 .Net 3.5 (x86, qui est la seule plate-forme pour laquelle il est compilé) nous a donné cette même erreur sur notre serveur Windows x64.

J'ai essayé de compiler pour x86 et x64 et j'obtiens la même erreur. J'ai essayé de supprimer toutes les sorties du compilateur (bin et obj). Enfin, j'ai fait directement référence à la dll SQLite, quelque chose qui n'était pas nécessaire pour que le projet fonctionne sur le serveur et j'ai cette erreur de compilation:

Erreur 1 Avertissement comme erreur: Génération d'assembly - L'assembly référencé 'System.Data.SQLite.dll' cible un processeur différent MyProject

Des idées sur ce que pourrait être le problème?

Plus de détails d'erreur:

Erreur source:

Une exception non gérée a été générée lors de l'exécution de la requête Web actuelle. Les informations concernant l'origine et l'emplacement de l'exception peuvent être identifiées à l'aide de la trace de pile d'exceptions ci-dessous.

Trace de la pile:

[BadImageFormatException: impossible de charger le fichier ou l'assembly 'System.Data.SQLite, Version = 1.0.61.0, Culture = neutral, PublicKeyToken = db937bc2d44ff139' ou l'une de ses dépendances. Une tentative a été faite pour charger un programme avec un format incorrect.]
System.Reflection.Assembly._nLoad (AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark & ​​stackMark, Boolean throwOnFileNotFound, Boolean forIntrembly.Assection) +0
System.Reflection.Assection. .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 & ​​+ stackMark, SystemRefection.Assembly. Load (String assemblyString) +28
System.Web.Configuration.CompilationSection.LoadAssemblyHelper (String assemblyName, booléen starDirective) +46

[ConfigurationErrorsException: impossible de charger le fichier ou l'assembly 'System.Data.SQLite, Version = 1.0.61.0, Culture = neutral, PublicKeyToken = db937bc2d44ff139' ou l'une de ses dépendances. Une tentative a été faite pour charger un programme avec un format incorrect.]
System.Web.Configuration.CompilationSection.LoadAssemblyHelper (String assemblyName, Boolean starDirective) +613 System.Web.Configuration.CompilationSection.LoadAllAssembliesFromAppDomainBinDirectory () +203 System.Webiguration .CompilationSection.LoadAssembly (AssemblyInfo ai) +105
System.Web.Compilation.BuildManager.GetReferencedAssemblies (CompilationSection compConfig) +178
System.Web.Compilation.BuildProvidersCompiler..ctor (VirtualPath configPath, Boolean + outputAssemblies)
System.Web.Compilation.ApplicationBuildProvider.GetGlobalAsaxBuildResult (Boolean isPrecompiledApp) +232
System.Web.Compilation.BuildManager.CompileGlobalAsax () +52 System.Web.Compilation.BuildManager.EnsureTopLevelFiles (337)

[HttpException (0x80004005): impossible de charger le fichier ou l'assembly 'System.Data.SQLite, Version = 1.0.61.0, Culture = neutre, PublicKeyToken = db937bc2d44ff139' ou l'une de ses dépendances. Une tentative de chargement d'un programme avec un format incorrect a été effectuée.]
System.Web.Compilation.BuildManager.ReportTopLevelCompilationException () +58 System.Web.Compilation.BuildManager.EnsureTopLevelFilesCompiled () +512 System.Web.Hosting.HostingEnvironment.Initialize ( ApplicationManager appManager, IApplicationHost appHost, IConfigMapPathFactory configMapPathFactory, HostingEnvironmentParameters hébergementParamètres) +729

[HttpException (0x80004005): impossible de charger le fichier ou l'assembly 'System.Data.SQLite, Version = 1.0.61.0, Culture = neutre, PublicKeyToken = db937bc2d44ff139' ou l'une de ses dépendances. Une tentative de chargement d'un programme avec un format incorrect a été effectuée.]
System.Web.HttpRuntime.FirstRequestInit (contexte HttpContext) +8896783
System.Web.HttpRuntime.EnsureFirstRequestInit (contexte HttpContext) +85
System.Web.HttpRuntestime.Process ) +259

pupeno
la source
Un journal de fusion (liaison d'assemblage) est beaucoup plus utile dans de tels cas que cette feuille de trace de pile.
Anton Tykhyy
1
Il semble que le problème soit que Cassini est x86.
pupeno
J'ai eu le même problème et j'ai dû abandonner ELMAH en raison de l'environnement mixte de production / développement que nous avons. Étant donné que l'utilisation de SQLite sur un serveur Web de production à fort trafic ne sonne pas très bien et le fait que SQLite dll est le seul assemblage d'ELMAH qui l'oblige à avoir deux versions différentes pour x86 et 64x bits, je me demande pourquoi les gars d'ELMAH tirent et le rendre facultatif plutôt que ce qu'il est maintenant.
Khash

Réponses:

122

System.Data.SQLite.dllest un assemblage mixte, c'est-à-dire qu'il contient à la fois du code managé et du code natif. Par conséquent, un particulier System.Data.SQLite.dllest soit x86, soit x64, mais jamais les deux.

Mise à jour ( avec la permission de J. Pablo Fernandez ): Cassini, le serveur web de développement utilisé par Visual Studio lorsque vous appuyez sur F5 ou cliquez sur le bouton vert «play», est uniquement x86 ce qui signifie que même si votre poste de travail est x64, vous ne serez capable d'utiliser la version x86 de System.Data.SQLite.dll.

Une alternative est de ne pas utiliser Cassini mais IIS7 qui est correctement x64.

Anton Tykhyy
la source
3
J'utilise la version x64 sur un ordinateur x64.
pupeno
Avez-vous essayé d'utiliser la version x86?
Anton Tykhyy
2
Une nouvelle alternative qui est devenue disponible il y a peu est d'utiliser IIS Express qui vous permet de définir le type de pool d'applications que vous souhaitez utiliser
Raul Vejar
@Raul Vejar: veuillez expliquer comment la fonctionnalité de sélection de pool d'applications d'IIS Express résout le problème d'assemblage 32 bits / 64 bits. Merci
Tim
@Tim, cette fonctionnalité vous permet de sélectionner le type de pool d'applications que vous souhaitez utiliser, 32 ou 64 bits, de cette façon, vous pouvez contrôler cet aspect qui a été corrigé dans Cassini et travailler avec la même bibliothèque de bits que vous avez. En d'autres termes, si vous utilisez la version 32 bits de la DLL SQLite, vous devez sélectionner le pool d'applications 32 bits sur IIS Express. Pour la version 64 bits de la bibliothèque, vous devez sélectionner le pool d'applications 64 bits.
Raul Vejar
77

Assurez-vous que «Activer les applications 32 bits» est défini sur false pour le pool d'applications.

beckelmw
la source
2
Cela fonctionne si vous souhaitez utiliser la dll x86 sur une machine 64 bits. Dans notre cas, nos environnements de développement et de production ne correspondent pas, c'est donc ce qui fonctionnait le mieux.
Rob
17
Le définir sur vrai pour moi a en fait résolu le problème. Je suppose qu'Elmah est livré avec l'assemblage sql lite 32 bits par défaut.
1
+1 pour @Jirapong et Sergey parce que c'était ce paramètre que je devais manipuler pour que les choses fonctionnent. Dans mon cas, je pense que j'avais la version x86 de la DLL SqlLite et que j'avais besoin d'activer les applications 32 bits pour être défini sur «vrai».
t3rse
43

Accédez au IIS7 Application Pool -> advanced settings and set the 32-bit application to true.

umar
la source
J'utilise Windows 7 et j'ai rencontré ce problème; l'activation de 32 bits l'a corrigé pour moi, probablement parce que ma copie de la DLL était de 32 bits.
Doug le
1
FYI: Il était nécessaire de définir l'identité du pool d'applications sur LocalSystem pour que cela fonctionne: ^
Illuminati
Et assurez-vous d'avoir une version Win32 de SQLite.Interop.dll stackoverflow.com/questions/4816529/…
Morten Holmgaard
14

C'est très simple si vous n'utilisez pas SQLite:

Vous pouvez supprimer les DLL SQLite des dossiers bin de votre solution, puis du dossier où vous référencez ELMAH. Reconstruisez et votre application n'essaiera pas de charger cette DLL que vous n'utilisez pas.

Chris
la source
5
+1 Si vous n'utilisez pas SQLite, pourquoi se donner la peine de réparer la DLL référencée? Nice, élégant et exactement ce dont j'avais besoin.
bhavinb
Cela a fonctionné localement, mais j'ai ensuite eu l'erreur après le déploiement sur Azure.
stuartdotnet
8

J'ai une machine de développement 64 bits et un serveur de construction 32 bits. J'ai utilisé ce code avant l'initialisation de NHibernate. Fonctionne à merveille sur n'importe quelle architecture (enfin les 2 que j'ai testées)

J'espère que cela aide quelqu'un.

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
la source
Quelqu'un a-t-il utilisé avec succès cette technique? Je l'ai essayé dans une solution d'application test asp.net mvc et cela n'a pas fonctionné pour moi.
Glenn
1
Au lieu d'accéder à la variable d'environnement, vous pouvez utiliser directement le CLR: string arch = IntPtr.Size == 8? "x64": "x86";
Jason Morse
2
Ou la propriété Environment.Is64BitProcess (depuis .NET4).
riezebosch le
5

Dans notre cas, cela n'a pas fonctionné car notre serveur de production est manquant

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

Nous l'avons installé et tout fonctionne bien. Le pool d'applications doit avoir Activer les applications 32 bits défini sur true et vous devez utiliser la version x86 de la bibliothèque

Marcos Meli
la source
1
Travaille pour moi. Il donne juste un message d'erreur sans indiquer que la bibliothèque C est manquante, ce qui est horrible.
brk
1
Pour moi, j'ai installé vcredist 2008 x64 pour System.Data.SQLite, Version = 1.0.99.0, Culture = neutral, PublicKeyToken = db937bc2d44ff139
themadmax
5

En tant que personne qui a dû faire face à pas mal de rapports de bogues sur Roadkill Wiki avec exactement le même problème, voici ce que vous devez faire:

  • Utilisez-vous x64 ou x86? Sqlite est livré avec des DLL pour des architectures séparées - copiez la bonne dans votre dossier bin, il y a deux DLL pour le fournisseur officiel:System.Data.SQLite.dll System.Data.SQLite.Linq.dll
  • Si vous ne pouvez pas être dérangé par la recherche de ces assemblages, activez le mode 32 bits pour votre pool d'applications (une solution pour les machines de développement uniquement généralement)
  • Si vous hébergez sur un serveur, vous aurez besoin du Microsoft C ++ Runtime redistribuable - il n'est pas installé sur Server 2008 R2 par défaut. la version 64 bits , la version x86

C'est une vraie douleur dans le cul combien de cerceaux vous devez sauter lors de la redistribution des binaires SQLite .NET, ma solution pour Roadkill à la fin était de copier les binaires corrects dans le dossier ~ / bin en fonction de l'architecture que vous utilisez . Malheureusement, cela ne résout pas le problème d'exécution C ++.

Chris S
la source
5

J'ai résolu ce problème en installant System.Data.SQLite avec l'extension Nuget. Cette extension peut être utilisée pour Visual Studio 2010 ou version ultérieure. Tout d'abord, vous devez installer l'extension Nuget. Vous pouvez suivre ici:

  • Accédez à Visual Studio 2010, Menu -> Outils
  • Sélectionnez Extension Manager
  • Entrez NuGet dans la zone de recherche et cliquez sur Galerie en ligne. En attente de récupération des informations…
  • Sélectionnez le gestionnaire de packages NuGet récupéré, cliquez sur Télécharger. En attente de téléchargement…
  • Cliquez sur Installer sur le Gestionnaire de package NuGet du programme d'installation de l'extension Visual Studio. Attendez la fin de l'installation.
  • Cliquez sur Fermer et sur «Redémarrer maintenant».

Deuxièmement, maintenant, vous pouvez installer SQLite:

Et maintenant, vous pouvez utiliser System.Data.SQLite.

Dans le cas, vous voyez deux dossiers x64 et, x86, ces dossiers contiennent SQLite.Interop.dll. Maintenant, allez dans les fenêtres de propriétés de ces dll et définissez l'action de construction est le contenu et Copier dans le répertoire de sortie est toujours Copier.

Alors, c'est ma façon.

Merci. Kim Tho Pham, ville de HoChiMinh, Vietnam. Courriel: [email protected]

Kim Thọ Phạm
la source
4

L'assemblage System.Data.SQLite lié à la charge manuelle peut résoudre ce problème.

Code de gatapia modifié comme ci-dessous:

    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
la source
4

J'ai eu cette erreur lorsque notre serveur Windows a été converti du système d'exploitation 32 bits en 64 bits. L'assembly qui lançait l'erreur était configuré pour se compiler en mode x86 (c'est-à-dire en mode 32). Je l'ai commuté sur "N'importe quel processeur" et cela a fait l'affaire. Vous pouvez modifier cette valeur en procédant comme suit:

clic droit sur le projet aller à Properties -> Build -> Platform Target -> change to "Any CPU"

goku_da_master
la source
1
J'essayais d'utiliser System.Data.SQLite.dll 32 bits et d'obtenir cette exception lors de l'exécution sur un processeur 64 bits. J'ai changé la cible de la plate-forme de "Any CPU" à "x86" et cela a fait disparaître l'exception. Je suppose qu'à moins que vous ne cherchiez à maximiser les performances, il est préférable de construire pour le plus petit dénominateur commun afin qu'il fonctionne sur un processeur 32 ou 64 bits.
cdavidyoung
3

J'ai résolu cela, assez curieusement, en installant System.Data.SQLite via l'application graphique Nuget, par opposition à la console du gestionnaire de packages.

L'installation via la console n'incluait pas les dépendances dont cette bibliothèque a besoin pour s'exécuter.

JMK
la source
3

System.Data.SQLitea une dépendance sur System.Data.SQLite.interopassurez-vous que les deux packages sont de la même version et sont tous les deux x86 .

C'est une vieille question, mais j'ai essayé tout ce qui précède. Je travaillais sur un projet strictement x86 , donc il n'y avait pas deux dossiers / x86, / x64. Mais pour une raison quelconque, il System.Data.SQLites'agissait d'une version différente de System.Data.SQLite.interop, une fois que j'ai retiré les dll correspondantes, le problème était résolu.

Flux d'empileur
la source
1

J'ai trouvé 2 solutions rapides. Soit travailler pour moi. Je pense que le problème vient des autorisations.

1) Au lieu d'utiliser le fichier Elmah.dll du répertoire net-2.0, j'ai utilisé Elmah.dll de net-1.1.

2) Au lieu de conserver Elmah.dll dans le répertoire bin du projet. Je crée un répertoire dll pour le mettre.

Anon
la source
1

Une autre façon de contourner ce problème consiste simplement à mettre à niveau votre application vers ELMAH 1.2 plutôt que 1.1.

Peter Bernier
la source
0

Pouvez-vous supprimer votre dossier de débogage bin et recompiler à nouveau?

Ou vérifiez la référence de votre projet au System.Data.SQLite, recherchez où il se trouve, puis ouvrez la DLL dans le réflecteur. Si vous ne pouvez pas l'ouvrir, cela signifie que la DLL est corrompue, vous voudrez peut-être en trouver une correcte ou réinstaller le framework .net.

Graviton
la source
J'ai essayé d'ajouter la référence à System.Data.SQLite directement (mis à part la suppression de bin et obj) et j'ai cette erreur: Erreur 1 Avertissement comme erreur: Génération d'assembly - Assemblage référencé 'System.Data.SQLite.dll 'cible un autre processeur MyProject
pupeno
0

Si vous utilisez IIS Express comme serveur Web sur votre machine de développement, je passerais à IIS local. Cela a fonctionné pour moi.

cyclo_magic
la source
0

Ceci est un ancien message, mais cela peut aider certaines personnes recherchant cette erreur à essayer de définir «Activer les applications 32 bits» sur Vrai pour le pool d'applications. C'est ce qui a résolu l'erreur pour moi. Je suis tombé sur cette solution en lisant certains des commentaires sur la réponse de @ beckelmw.

MichaelD
la source
0

Vous avez probablement installé le mauvais package. Vous voulez le package produit par Microsoft qui implémente le modèle de fournisseur System.Data.Common.

pimbrouwers
la source