web-dev-qa-db-fra.com

System.IO.FileLoadException: impossible de charger le fichier ou l'assembly 'System.Data.SQLite

(Il s'agit d'une question en double qui a été posée dans stackoverflow.com. J'ai lu les réponses. J'ai essayé les solutions, mais cela n'a pas résolu mon problème. Je vais expliquer quel est mon problème et ce qu'il a J'ai fait).

Voici mon problème:

Mon application a utilisé System.Data.SQLite.DLL. Je l'ai référencé et fonctionne normalement sur mon ordinateur, mais il n'a pas pu s'exécuter sur un autre ordinateur. Voici le message d'erreur:

System.IO.FileLoadException: impossible de charger le fichier ou l'assembly 'System.Data.SQLite, Version = 1.0.88.0, Culture = neutral, PublicKeyToken = db937bc2d44ff139' ou l'une de ses dépendances. L'application n'a pas pu démarrer car elle est côte à côte
La configuration est incorrecte. Veuillez consulter le journal des événements de l'application ou utiliser l'outil de ligne de commande sxstrace.exe pour plus de détails.
(Exception de HRESULT: 0x800736B1) Nom de fichier: 'System.Data.SQLite, Version = 1.0.88.0, Culture = neutral, PublicKeyToken = db937bc2d44ff139' ---> System.Runtime.InteropServices.COMException (0x800736B1) : L'application n'a pas pu démarrer car elle est côte à côte
La configuration est incorrecte. Veuillez consulter le journal des événements de l'application ou utiliser l'outil de ligne de commande sxstrace.exe pour plus de détails.
(Exception de HRESULT: 0x800736B1) à SimPB.config.PrepareDatabase () à SimPB.config.InitializeProgram () à SimPB.Program.Main ()

Mon ordinateur exécute Windows 7 32 bits, Visual Studio 2010.

Un autre ordinateur exécute également Windows 7 32 bits, sans Visual Studio installé.

Ce que j'ai essayé:

Tentative 1: Assurez-vous que l'application est construite avec Release + x86 et l'application est construite avec le framework cible: . NET Framework 2.0 . Terminé.

Tentative 2: Assurez-vous que l'application référencée avec la version correcte de System.Data.SQLite, qui est x86 + .Net Framework 2.0 (sqlite-netFx20- binaire-Win32-2005-1.0.88.0). Terminé

Tentative 3: Essayez ces codes sur App.config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <startup>
    <supportedRuntime version="v2.0.50727"/>
  </startup>
</configuration>

et ça

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <startup>
    <supportedRuntime version="v2.0.50727"/>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
  </startup>
  <runtime>
    <NetFx40_LegacySecurityPolicy enabled="true"/>
  </runtime>
</configuration>

et ça

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v2.0.50727"/>
  </startup>
</configuration>

Terminé.

Tentative 4: Essayez de désactiver le contrôle de compte d'utilisateur sur un autre ordinateur. Terminé.

Tentative 5: Essayez d'installer Visual C++ Runtime sur un autre ordinateur (j'installe Visual Microsoft Visual C++ Runtime 2010 Redistributable Package (x86), également essayé 2005 verson. ). Terminé.

Tentative 6: Essayez de réinstaller .NET Framework 2.0 SP2. Erreur de réception:

Vous devez utiliser "Activer ou désactiver les fonctionnalités Windows" dans le Panneau de configuration pour installer ou configurer Microsoft .NET Framework 2.0 SP2.

Mise à jour: (après avoir lu les réponses et les commentaires)
Tentative 7: Assurez-vous que System.Data.SQLite.DLL se trouve dans le dossier du bac de sortie. Terminé

Tentative 8: Double-confirmez que l'autre ordinateur exécute Windows 7. 32 bits. Terminé

Tentative 9: Modifiez la déclaration HintPath dans le fichier .csproj:
Change ça:

<Reference Include="System.Data.SQLite, Version=1.0.88.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=x86">
  <HintPath>E:\Developer Soft\SQLite\sqlite-netFx20-binary-bundle-Win32-2005-1.0.88.0\System.Data.SQLite.dll</HintPath>
</Reference>

Pour ça:

<Reference Include="System.Data.SQLite, Version=1.0.88.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=x86">
  <HintPath>..\System.Data.SQLite.dll</HintPath>
</Reference>

Terminé pour la tentative 9.

Après les tentatives ci-dessus, le résultat est toujours le même. L'application peut s'exécuter normalement depuis mon ordinateur et n'a pas pu s'exécuter sur un autre ordinateur.

Ceci est un logiciel gratuit open source, Annuaire téléphonique simple . J'ai validé et téléchargé le dernier code source sur son serveur de contrôle de source à l'adresse:
http://simpb.codeplex.com/SourceControl/list/changesets (Numéro de l'ensemble de modifications: fd847ac6c406)

14
mjb

J'ai résolu le problème. Voici comment je résous:

Petite histoire:
Utilisez une ancienne version de System.Data.SQLite. La nouvelle version est suspectée d'avoir des bugs (je peux me tromper).

Longue histoire:
J'ai commencé à rappeler pourquoi mon ancienne version précédente de ce programme peut être exécutée sur un autre ordinateur et cette nouvelle version ne peut pas. Quels sont les changements évidents que j'ai apportés?

Oui, j'ai changé la version de System.Data.SQLite.

L'ancienne version de System.Data.SQLite utilisée par ce programme est V1.0.66 . La nouvelle version que j'ai utilisée est la dernière version: V1.0.88 , sortie le 8 août 2013 . (Oui, ce qui est d'environ il y a 4 jours à partir d'aujourd'hui). En savoir plus: http://system.data.sqlite.org/index.html/timeline

Ensuite, j'ai décidé d'abandonner la nouvelle version (V1.0.88) et j'ai utilisé l'ancienne version (V1.0.66), et tout est revenu à la normale. Le programme est à nouveau exécutable sur un autre ordinateur.

J'ai essayé de consulter le code source de V1.0.88 , mais je n'ai pas réussi à localiser les lignes de code qui causent le problème. Le mieux que je puisse découvrir est au projet de System.Data.SQLite.Interop . Lorsque je charge la solution dans Visual Studio 2010, System.Data.SQLite.Interop est prédéfini pour être construit pour .NET Framework 4.0. Je ne sais pas comment le changer. Plus tard, je recharge la solution dans Visual Studio 2008, les propriétés communes de System.Data.SQLite.Interop montrant qu'elle va se construire pour .NET Framework 2.0 (qui est ce que je recherche), mais je n'arrive pas à construire la solution. Certaines erreurs de génération se produisent. Je n'ai pas passé le temps à le déboguer.

J'ai besoin de développer le programme pour .NET Framework 2.0, car il y a des utilisateurs qui utilisent toujours Windows XP.

Je suppose que V1.0.88 contient des bogues, mais je peux me tromper. Quoi qu'il en soit, comme pour la solution actuelle, je m'en tiens à V1.0.66 .

5
mjb

L'assembly ne peut pas être localisé en raison d'une déclaration HintPath dans votre fichier .csproj :

<Reference Include="System.Data.SQLite, Version=1.0.88.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=x86">
  <HintPath>E:\Developer Soft\SQLite\sqlite-netFx20-binary-bundle-Win32-2005-1.0.88.0\System.Data.SQLite.dll</HintPath>
</Reference>

Cela fonctionne sur votre machine, car vous avez vraiment le fichier .dll à cet emplacement. Cependant, l'autre personne peut souhaiter utiliser le fichier System.Data.SQLite.dll que vous avez placé à la racine du référentiel. Comme il s'agit d'un niveau supérieur au .csproj, vous pouvez utiliser un chemin relatif, comme ceci:

<Reference Include="System.Data.SQLite, Version=1.0.88.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=x86">
  <HintPath>..\System.Data.SQLite.dll</HintPath>
</Reference>

et cela devrait bien fonctionner.

6
Cristian Lupascu

J'ai également eu des problèmes avec SQLite depuis la v1.0.66 sur les machines x64/x86. Je n'ai jamais pu installer ServiceStack puis SqLite.x86 avec le package nuget et le faire fonctionner hors de la boîte.

Mais aujourd'hui, j'ai changé le processus d'installation avec succès, et cela pourrait aussi être une solution pour vous. Je soupçonne que le problème est toujours que la version de System.Data.SQlite n'est pas alignée avec celle attendue par Servicestack.Ormlite.SqliteNET.

Le prochain processus dans la console Nuget fait fonctionner les choses pour moi:

Install-Package System.Data.Sqlite.x86 -Version 1.0.88.0
Install-Package ServiceStack -Version 3.9.71
Install-Package ServiceStack.OrmLite.Sqlite32 -Version 3.9.71
1
jruizaranguren

Dans votre fichier App.config, ajoutez ces lignes à l'intérieur du <configuration> élément:
<runtime> <loadFromRemoteSources enabled="true"/> </runtime>

1
Coder1224

Vérifiez si MS Visual C++ exécute une installation redistribuable, car System.Data.SQLite en dépend.

0
Leng Weh Seng