2009-10-25 5 views
6

J'ai écrit une application qui utilise sqlite et fonctionne très bien sur plus des systèmes. Il est écrit en C# et le seul assembly hors-cadre est sqlite, qui est inclus par System.Data.SQLite.dll.Sur certains ordinateurs, l'application ne peut pas charger le fichier sqlite dll

Je le déploie de la même manière sur toutes les machines (copie du fichier exe, du fichier de base de données et du fichier System.Data.SQLite). Cela fonctionne très bien pour tous mes PC et la plupart des PC que j'ai essayés.

Mais alors que j'ai rapports que pour certaines personnes, il jette l'exception suivante:

Impossible de charger le fichier ou l'assemblage « System.Data.SQLite, Version = 1.0.65.0, Culture = neutre, PublicKeyToken = db937bc2d44ff139 'ou l'une de ses dépendances. Une tentative a été effectuée pour charger un programme avec un format incorrect .

Maintenant, je me suis assuré que le fichier dll est dans le même dossier que le fichier d'application exe. C'est la même DLL, avec la même version que celle indiquée dans le message d'exception ci-dessus. J'ai été vraiment confus par cela, donc j'ai créé une nouvelle machine virtuelle, installé Windows 7 professionnel sur elle, et juste copié collé les fichiers, et la chose a fonctionné. Donc, si cela fonctionne sur une nouvelle fenêtre, je ne peux pas imaginer ce que les autres PC pourraient manquer ...

Remarque: Deux de ces machines où le projet lance l'exception exécutent également windows 7 proffesional.

J'apprécierais vraiment aucune aide à ce sujet, parce que je suis frais d'idées ...

Répondre

12

est ici possible: La différence entre les machines de travail et non-travail 32 bits par rapport 64- bit? Est-ce que vous construisez pour "n'importe quel CPU", quand vous devriez construire juste pour le bitness de votre DLL externe?

+0

Merci beaucoup! Totalement manqué que sqlite.NET a deux fichiers dll différents - pour x32 et x64. J'ai changé de DLL sur les machines sur lesquelles ça ne fonctionnait pas et ça marche maintenant. Je n'ai jamais pensé à leur demander 32 vs 64 bits ... –

+0

Y at-il un moyen de vérifier à l'exécution si la plate-forme est 32/64 bits et agir en conséquence dans ce cas? – Ben

+0

@Ben: J'ai peur de ne pas savoir. Vous auriez besoin de charger dynamiquement la bonne DLL sqlite à l'exécution, mais je ne sais pas comment le faire dans .net. – RichieHindle

1

Il est possible que les machines qui émettent l'exception exécutent une version 64 bits de Windows et que votre programme utilise la configuration AnyCPU. La DLL System.Data.SQLite est une bête à deux faces: une partie gérée et une partie native. Il se pourrait que la partie native soit responsable de l'exception.

Voir this question pour plus d'informations.

1

Avez-vous vérifié si le système cible est 64 bits ou 32 bits?

Il se peut que l'une de vos dépendances nécessite une version 32 bits de Windows. Pour résoudre le problème, vous pouvez spécifier une cible de plateforme dans les propriétés de votre projet C#: Choisissez x86 au lieu de Any CPU.

Questions connexes