Impossible de charger le fichier ou l'assembly « System.Data.SQLite »
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) +46ConfigurationErrorsException: 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
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:
- Aller à la TOOLS- de menu> Package Bibliothèque Manager-> Package Manager Console du Visual Studio.
- Ensuite, exécutez la commande Install-Package System.Data.SQLite dans Package Manager Console. Comme ça: exécutez la commande Install-Package System.Data.SQLite dans Package Manager Console
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.