Question

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

  

Impossible de charger le fichier ou l'assemblage   « System.Data.SQLite, Version = 1.0.61.0,   Culture = neutral,   PublicKeyToken = db937bc2d44ff139' ou   une de ses dépendances. Un essai   a été fait pour charger un programme avec un   format incorrect.

     

Description:   exception non gérée a eu lieu au cours   l'exécution de la bande en cours   demande. S'il vous plaît examiner 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: Pourrait   de charger le fichier ou l'assemblage   « System.Data.SQLite, Version = 1.0.61.0,   Culture = neutral,   PublicKeyToken = db937bc2d44ff139' ou   une de ses dépendances. Un essai   a été fait pour charger un programme avec un   format incorrect.

Plus de détails d'erreur en bas.

Ma plate-forme Active Solution est « Any CPU » et je suis en cours d'exécution sur un Windows 7 x64 sur un x64, bien sûr, processeur. La raison pour laquelle nous utilisons cette version de ELMAH est parce 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 x64 de Windows.

J'ai essayé la compilation pour x86 et x64 et je reçois la même erreur. Je l'ai essayé de supprimer la sortie tout compilateur (bin et obj). Enfin, je l'ai fait une référence au SQLite dll directement, quelque chose qui n'a pas été nécessaire pour que le projet fonctionne sur le serveur et je l'ai obtenu cette erreur du compilateur:

  

1 Erreur avertissement concernant Erreur: génération d'assemblage - Ensemble de référencement de cibles « System.Data.SQLite.dll » un processeur différent MyProject

Toutes les idées que le problème pourrait être?

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 du courant   demande Web. Les informations concernant la   origine et l'emplacement de l'exception   peuvent être identifiés à l'aide l'exception   Trace de la pile ci-dessous.

     

Trace de la pile:

     

[BadImageFormatException: Impossible   fichier de chargement ou de montage   « System.Data.SQLite, Version = 1.0.61.0,   Culture = neutral,   PublicKeyToken = db937bc2d44ff139' ou   une de ses dépendances. Un essai   a été fait pour charger un programme avec un   format incorrect.]
  System.Reflection.Assembly._nLoad (AssemblyName   fileName, String codeBase, Témoignages   assemblySecurity, Assemblée   locationHint, StackCrawlMark &   stackMark, Boolean   throwOnFileNotFound, Boolean   forIntrospection) +0
  System.Reflection.Assembly.nLoad (AssemblyName   fileName, String codeBase, Témoignages   assemblySecurity, Assemblée   locationHint, StackCrawlMark &   stackMark, Boolean   throwOnFileNotFound, Boolean   forIntrospection) +43
  System.Reflection.Assembly.InternalLoad (AssemblyName   assemblyRef, Témoignages   assemblySecurity, StackCrawlMark &   stackMark, Boolean forIntrospection)   +127 System.Reflection.Assembly.InternalLoad (String   assemblyString, Témoignages   assemblySecurity, StackCrawlMark &   stackMark, Boolean forIntrospection)   +142 System.Reflection.Assembly.Load (String   assemblyString) +28
  System.Web.Configuration.CompilationSection.LoadAssemblyHelper (String   assemblyName, Boolean starDirective)   +46

     [

ConfigurationErrorsException: Could   de charger le fichier ou l'assemblage   « System.Data.SQLite, Version = 1.0.61.0,   Culture = neutral,   PublicKeyToken = db937bc2d44ff139' ou   une de ses dépendances. Un essai   a été fait 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.Web.Configuration.CompilationSection.LoadAssembly (AssemblyInfo   ai)
+105   System.Web.Compilation.BuildManager.GetReferencedAssemblies (CompilationSection   compConfig)
+178   System.Web.Compilation.BuildProvidersCompiler..ctor (VirtualPath   configpath, Boolean   supportLocalization, String   outputAssemblyName) +54
  System.Web.Compilation.ApplicationBuildProvider.GetGlobalAsaxBuildResult (Boolean   isPrecompiledApp)
+232   System.Web.Compilation.BuildManager.CompileGlobalAsax ()   52 System.Web.Compilation.BuildManager.EnsureTopLevelFilesCompiled ()   +337

     

[HttpException (0x80004005): Impossible   fichier de chargement ou de montage   « System.Data.SQLite, Version = 1.0.61.0,   Culture = neutral,   PublicKeyToken = db937bc2d44ff139' ou   une de ses dépendances. Un essai   a été fait pour charger un programme avec un   format incorrect.]
  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): Impossible   fichier de chargement ou de montage   « System.Data.SQLite, Version = 1.0.61.0,   Culture = neutral,   PublicKeyToken = db937bc2d44ff139' ou   une de ses dépendances. Un essai   a été fait pour charger un programme avec un   format incorrect.]
  System.Web.HttpRuntime.FirstRequestInit (HttpContext   contexte) +8896783
  System.Web.HttpRuntime.EnsureFirstRequestInit (HttpContext   contexte) +85
  System.Web.HttpRuntime.ProcessRequestInternal (HttpWorkerRequest   wr) 259

Était-ce utile?

La solution

System.Data.SQLite.dll est un ensemble mixte, à savoir qu'il contient à la fois le code managé et du code natif. Par conséquent, un System.Data.SQLite.dll particulier est x86 ou x64, mais jamais les deux.

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

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

Autres conseils

Assurez-vous que "Activer 32 - Applications Bit". Est définie sur false pour le pool d'application

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

Ceci est très simple si vous ne l'utilisez SQLite:

Vous pouvez supprimer les DLL SQLite à partir des dossiers bin de votre solution, puis à partir du dossier dans lequel vous faites référence à ELMAH. Reconstruire et votre application ne sera pas essayer de charger cette DLL que vous n'utilisez pas.

I ai une machine de dev 64 bits et le serveur de compilation 32 bits. J'ai utilisé ce code avant l'initialisation NHibernate. Travaille un charme sur une architecture (bien 2 J'ai testé)

Espérons 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";
        }

Comme quelqu'un qui a dû faire face à un bon nombre de rapports de bugs 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 DLL pour les architectures distinctes - copier le bon 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 la chasse autour tracassé pour ces assemblées, activez le mode 32 bits pour votre piscine App (une solution pour les machines de dev généralement seulement)
  • Si vous hébergez sur un serveur, vous aurez besoin du Microsoft C ++ Runtime redistribuable - il est pas installé sur le serveur 2008 R2 par défaut. la version x64 , Version x86

Il est une vraie douleur dans le cul combien de cerceaux vous devez sauter à travers lors d'une nouvelle distribution des SQLite binaires .NET, ma solution pour Roadkill à la fin était de copier les fichiers binaires corrects dans le dossier ~ / bin sur la base l'architecture de votre usage. Malheureusement, cela ne résout pas le problème d'exécution C de.

Je résolus en installant System.Data.SQLite avec l'extension Nuget. Cette extension peut utiliser pour Visual Studio 2010 ou plus. Tout d'abord, vous devez installer l'extension Nuget. Vous pouvez suivre ici:

  • Aller à Visual Studio 2010, Menu -> Outils
  • Sélectionnez Extension Manager
  • Entrez NuGet dans la zone de recherche et cliquez sur Galerie en ligne. En attendant, il Retrieve d'informations ...
  • Sélectionnez le NuGet récupéré Package Manager, cliquez sur Télécharger. Waiting Télécharger la ...
  • Cliquez sur Installer sur l'extension Visual Studio Installer NuGet Package Manager. Attendez que l'installation soit terminée.
  • Cliquez sur Fermer et « Redémarrer maintenant.

En second lieu, 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 aux propriétés de fenêtres de ces dll et de l'action de construction est fixé le contenu et les copier dans le répertoire de sortie est toujours copier.

Alors, c'est mon chemin.

Merci. Kim Tho Pham, Ho Chi Minh-Ville, Vietnam. Email: tho.phamkim@gmail.com

Chargement manuel liées à l'assemblage de System.Data.SQLite peut résoudre ce problème.

Changement de code de gatapia comme suit:

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

Je suis cette erreur lorsque notre serveur Windows a été converti de 32 bits OS à 64 bits. L'ensemble qui a été jeter l'erreur a été mis à compiler en mode x86 (ie mode 32). Je l'ai passé à « Tout CPU » et qui a fait l'affaire. Vous pouvez modifier cette valeur en procédant comme suit:

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

Dans notre cas ne fonctionne pas parce que notre serveur de production a disparu

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

Nous installons et travaillons tous très bien. Le pool d'applications doit avoir Activer les applications 32 bits la valeur true et vous devez la version x86 de la bibliothèque

Je résolus cela, assez curieusement, en installant System.Data.SQLite via l'application GUI Nuget, par opposition à la console de gestionnaire de paquets.

Installation via la console ne comprend pas les dépendances de cette bibliothèque a besoin pour fonctionner.

Je suis venu avec 2 solutions rapides. Soit travailler pour moi. Je pense que le problème est dû au fait des autorisations.

1) Au lieu d'utiliser le fichier Elmah.dll à partir du répertoire net 2.0, je Elmah.dll du net 1.1.

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

Une autre façon de contourner cela est juste pour mettre à jour votre application à ELMAH 1.2 plutôt que 1.1.

System.Data.SQLite a une dépendance à l'égard System.Data.SQLite.interop assurez-vous que les deux paquets sont la même version et sont à la fois x86 .

Ceci est une vieille question, mais j'ai essayé tout ce qui précède. Je travaillais sur un strict x86 projet , donc il n'y avait pas deux dossiers / x86, / x64. Mais pour une raison quelconque, la System.Data.SQLite était une version différente de System.Data.SQLite.interop, une fois que je baissai le correspondant dll problème a été résolu.

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

Ou vérifier votre référence de projet à la System.Data.SQLite, traquer où il se trouve, puis ouvrez le dll dans le réflecteur. Si vous ne pouvez pas l'ouvrir, cela signifie que le dll est corrompu, vous pouvez trouver un bon une ou réinstaller le framework .NET.

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

Ceci est un ancien poste, mais il peut aider certaines personnes à la recherche sur cette erreur d'essayer la mise en « Activer les applications 32 bits » True pour le pool d'application. C'est ce que résolu l'erreur pour moi. Je suis venu sur cette solution en lisant quelques commentaires à la réponse de @ beckelmw.

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top