264 votes

Impossible de charger la DLL 'SQLite.Interop.dll'.

Je reçois périodiquement l'exception suivante :

Unable to load DLL 'SQLite.Interop.dll': The specified module could not be found. (Exception from HRESULT: 0x8007007E)

J'utilise la version 1.0.82.0., je l'installe avec nuget dans VS2010, OS Win7 64.

Une fois que l'exception commence à apparaître, elle apparaît constamment - en débogage et en version et en exécutant l'application dans ou en dehors de VS.

Le seul moyen de l'arrêter est de se déconnecter et de se reconnecter. L'exception n'est pas levée et la dll est chargée. Cela peut fonctionner pendant plusieurs jours, mais ensuite, cela peut recommencer.

Quelqu'un a-t-il vu quelque chose comme ça et y a-t-il une solution ?

2 votes

Oui, c'est réglé pour copier toujours. J'ai des dossiers x64 et x86 dans bin/debug. Et ça marche la plupart du temps, mais parfois ça ne marche plus. Il est probable que quelque chose bloque l'accès à la dll, je vais essayer de le découvrir la prochaine fois qu'il s'arrête de fonctionner. Comme je l'ai dit, il peut fonctionner plusieurs jours sans problème.

19 votes

J'ai obtenu cette erreur dès la sortie de la boîte après avoir ajouté le paquet SQLite nuget à un nouveau projet de console. En copiant manuellement SQLite.Interop.dll du dossier x86 vers le haut d'un niveau, l'application peut fonctionner. Il me semble étrange que ce problème soit si grave.

0 votes

@Wayne Oui, cela aide vraiment. Mais dans mon cas, nous travaillons ensemble sur le projet, et mon ami utilise un système d'exploitation x86, tandis que moi x64. Et comme je l'ai remarqué, il s'arrête de fonctionner parfois. Bien que cela ne me soit pas arrivé le mois dernier.

161voto

Kugel Points 4595

Je sais que j'arrive tard dans la soirée mais j'ai eu ce problème juste après avoir téléchargé la dernière version x86/x64 aujourd'hui (version 1.0.88.0). Mon IIS local dans VS2012 fonctionne en 32 bits par défaut et il n'y a pas de moyen facile de passer en x64. Mon serveur de production fonctionne en 64 bits.

Quoi qu'il en soit, j'ai installé le paquet NuGet dans un projet DLL et j'ai obtenu cette erreur. Ce que j'ai dû faire pour le faire fonctionner, c'est de l'installer sur le site principal également. Même s'il ne touche pas du tout aux classes SQLite.

Je pense que SQLite utilise l'assemblage d'entrée pour détecter la version d'Interop à charger.

15 votes

Cela a fonctionné pour moi après avoir ajouté la référence à SQLite Core avec NuGet au projet principal.

0 votes

L'ajout de sqllite.core au projet principal a fonctionné pour moi sur ma solution WPF.

0 votes

J'ai dû faire à la fois install-package Sqlite ainsi que Install-Package System.Data.SQLite.Core dans mon site web même si les appels de db sont dans une bibliothèque....

51voto

Caleb Kiage Points 479

J'ai eu ce même problème en utilisant SQLite dans un projet WPF dont la plateforme cible était Any CPU . Je l'ai réparé en suivant les étapes suivantes :

  1. Ouvrez le concepteur de projet dans Visual Studio. Vous trouverez des détails sur la façon de procéder aquí .
  2. Cliquez sur l'onglet "Build".
  3. Désactiver le prefer 32-bit option.

Alternativement, vous pouvez simplement définir la cible de la plateforme à x86 o x64 . Je pense que ce problème est causé par le System.Data.SQLite en utilisant la cible de la plate-forme pour obtenir l'emplacement du fichier 'SQLite.Interop.dll'.

UPDATE :

Dans le cas où le concepteur du projet ne peut être atteint, il suffit d'ouvrir le projet ( *.csproj ) à partir d'un éditeur de texte et ajoutez la valeur <Prefer32Bit>false</Prefer32Bit> dans le <PropertyGroup>...</PropertyGroup> étiquette.

Exemple de code

<PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <ProjectGuid>[Set by Visual Studio]</ProjectGuid>
    <OutputType>Exe</OutputType>
    <AppDesignerFolder>Properties</AppDesignerFolder>
    <RootNamespace>[Set by Visual Studio]</RootNamespace>
    <AssemblyName>[Set by Visual Studio]</AssemblyName>
    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
    <FileAlignment>[Set by Visual Studio]</FileAlignment>
    <!--Add the line below to your project file. Leave everything else untouched-->
    <Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>

0 votes

J'utilise VS 2010, cette option n'existe pas.

0 votes

@xll, j'ai modifié la réponse pour la clarifier. Vérifiez si l'édition clarifie les choses.

0 votes

J'ai eu ce problème lorsque j'ai essayé de lancer l'application en mode de débogage VS 2012 avec la plateforme cible AnyCPU, et en désactivant la fonction Prefer 32-bit a fonctionné pour moi.

35voto

Wil Points 31

C'est ainsi que je l'ai corrigé dans mon projet.

Cela fonctionnait, et lorsqu'un collègue a soumis ses modifications, j'ai reçu l'exception "Unable to load DLL 'SQLite.Interop.dll'".

En comparant le fichier .csproj du projet, on constate qu'il s'agit de la version NON-FONCTIONNELLE :

<ItemGroup>
     <Content Include="x64\SQLite.Interop.dll" />
     <Content Include="x86\SQLite.Interop.dll" />
</ItemGroup>

Et voici ce que contenait la version WORKING :

<ItemGroup>
     <Content Include="x64\SQLite.Interop.dll">
          <CopyToOutputDirectory>Always</CopyToOutputDirectory>
      </Content>
      <Content Include="x86\SQLite.Interop.dll">
          <CopyToOutputDirectory>Always</CopyToOutputDirectory>
      </Content>
</ItemGroup>

Après avoir fait marche arrière, je n'ai pas reçu l'exception. Les fichiers DLL ont été vidés dans le répertoire Debug approprié. \x64 (etc).

0 votes

<itemgroup> for "SQLite.Interop.dll" is not there in project's .csproj file. still i tried to add your solution but didn't work :(

0 votes

Cela ne fonctionnera pas dans VS2012, les éléments n'existent pas.

0 votes

Merci beaucoup. Fonctionne en 2015 vs.

27voto

sfm Points 87

Quand vous vous retrouvez dans cet état, essayez d'effectuer un Rebuild-All. Si cela résout le problème, vous avez peut-être le même problème que moi.

Un peu de contexte (ma compréhension) :

  • SQLite possède un assemblage géré (System.Data.SQLite.dll) et plusieurs assemblages spécifiques à une assemblages spécifiques à la plate-forme (SQLite.Interop.dll). Lors de l'installation de SQLite avec Nuget, ce dernier ajoutera les assemblages spécifiques à la plate-forme à votre projet (dans plusieurs dossiers : SQLite.Interop.dll). (dans plusieurs dossiers : \x86 , \x64 ), et configure ces dlls à "Copier toujours".

  • Lors du chargement, l'assemblage géré recherchera la plateforme à l'intérieur du répertoire \x86 y \x64 dossiers. Vous pouvez voir plus à ce sujet aquí . L'exception est cette assemblée gérée l'exception de cet ensemble géré qui tente de trouver le fichier pertinent (SQLite.Interop.dll) dans ces ces dossiers (et échoue).

Mon scénario :

J'ai deux projets dans ma solution : une application WPF et une bibliothèque de classes. L'application WPF fait référence à la bibliothèque de classes, et la bibliothèque de classes fait référence à SQLite (installé via Nuget).

Le problème pour moi est que lorsque je modifie uniquement l'application WPF, VS tente de faire une reconstruction partielle (en réalisant que la dll dépendante n'a pas changé). Quelque part dans ce processus, VS nettoie le contenu du fichier \x86 y \x64 (en supprimant SQLite.Interop.dll). Lorsque je fais un Rebuild-All complet, VS copie les dossiers et leur contenu correctement.

Ma solution :

Pour résoudre ce problème, j'ai fini par ajouter un processus Post-Build utilisant xcopy pour forcer la copie du fichier \x86 y \x64 des dossiers de la bibliothèque de classes à mon projet WPF \bin répertoire.

Sinon, vous pouvez faire des choses plus sophistiquées avec la configuration de la construction / les répertoires de sortie.

1 votes

Le message que j'ai reçu m'indiquait que ces fichiers étaient manquants, mais je pensais qu'il s'agissait d'un problème de permission. Lorsque j'ai vu votre message, j'ai réalisé qu'ils n'étaient jamais arrivés sur le serveur lors du déploiement.

1 votes

Ma solution quasi identique a consisté à ajouter des dossiers x86 et x64 à mon projet de démarrage, puis à ajouter les fichiers interop x86 et interop x64 dans leurs dossiers respectifs. J'ai réglé l'option des fichiers sur "content" et "build always". C'est la seule façon dont j'ai pu obtenir que mon application Windows Forms se connecte à un fichier de base de données s3db intégré lorsque j'ai déployé l'application avec ClickOnce sur d'autres PC. Ce qui est frustrant, c'est que je n'ai pas eu d'erreur SQLite lorsque j'ai développé et testé l'application sur mon PC.

0 votes

Cela se produit toujours avec VS 2017 :'(

19voto

Michael Bromley Points 774

J'ai eu le même problème en utilisant Visual Studio Express 2013. J'ai essayé plusieurs solutions mentionnées ici et ailleurs, sans succès. J'espère que cette solution aidera d'autres personnes.

Je l'ai corrigé en utilisant le DeploymentItem attribut sur ma classe de test qui teste le service basé sur SQLite.

Ejemplo:

[TestClass]
[DeploymentItem(@"x86\SQLite.Interop.dll", "x86")] // this is the key
public class LocalStoreServiceTests
{

    [TestMethod]
    public void SomeTestThatWasFailing_DueToThisVeryIssue()
    {
         // ... test code here
    }
}

Cela entraîne la nécessité SQLite.Interop.dll pour être copié dans le x86 dans le dossier "TestResults" approprié.

Tout est vert. Tout est bon.

1 votes

Cette solution ne fonctionne que si vous utilisez l'espace de nom Microsoft.VisualStudio.TestTools.UnitTesting.

4 votes

C'est une solution correcte si vous utilisez MSTest. SQLite a bien fonctionné, trouvant la dll SQLite.Interop.dll sans problème, jusqu'à ce que j'utilise DeploymentItem("some.csv") pour un test. L'inclusion du fichier .csv de cette façon a déclenché la copie par MSTest de toutes les dlls référencées dans le répertoire TestResults. Comme SQLite.Interop.dll n'est pas référencé dans le projet (et ne peut pas l'être puisqu'il s'agit d'un code non géré), il n'a jamais été copié.

0 votes

Votre meilleure chance est d'ajouter deux lignes, une pour chaque architecture. Cela vous protège au cas où le programme d'exécution des tests fonctionnerait en 64 bits.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X