150 votes

Impossible de charger la DLL (Le module n'a pas pu être trouvé HRESULT : 0x8007007E)

J'ai une bibliothèque de dll contenant un code API C++ non géré que je dois utiliser dans mon application .NET 4.0. Mais chaque fois que j'essaie de charger ma dll, j'obtiens une erreur :

Impossible de charger la DLL 'MyOwn.dll' : Le module spécifié n'a pas pu être trouvé. (Exception de HRESULT : 0x8007007E)

J'ai lu et essayé plusieurs solutions que j'ai trouvées sur l'internet. Rien ne fonctionne

J'ai essayé d'utiliser les méthodes suivantes :

[DllImport("MyOwn.dll",  CallingConvention = CallingConvention.Cdecl)]
[return: MarshalAs((UnmanagedType.I4))]
public static extern Int32 MyProIni(string DBname, string DBuser_pass,
    string WorkDirectory, ref StringBuilder ErrorMessage);

Quand j'ai essayé de suivre cet article et lorsque j'exécute cet exemple (à partir du code téléchargé), il fonctionne sans problème (la dll utilisée est dans le dossier bin/debug).

J'ai copié ma dll (ainsi que tous les fichiers dont elle dépend dans mon dossier bin).

J'ai également essayé cette approche mais j'ai obtenu la même erreur :

[DllImportAttribute(MyOwnLibDllPath, EntryPoint="TMproIni")]
[return: MarshalAs(UnmanagedType.I4)]
public static extern  int MyproIni(string DBname, string DBuser_pass, 
    string WorkDirectory, ref StringBuilder ErrorMessage);

Des suggestions ?

104voto

Keith Halligan Points 725

Si je me souviens bien, sous Windows, l'ordre de recherche d'une dll est le suivant :

  1. Annuaire actuel
  2. Dossier système, C:\windows\system32 or c:\windows\SysWOW64 (pour un processus 32 bits sur une boîte 64 bits).
  3. Lecture de la Path variable d'environnement

En outre, je vérifierais les dépendances de la DLL, le marcheur de dépendances fourni avec Visual Studio peut vous aider ici, il peut également être téléchargé gratuitement : http://www.dependencywalker.com

5 votes

J'ai trouvé quelques dépendances manquantes (Oracle et quelques dll d'IE). J'ai besoin d'installer Oracle car ma dll en dépend alors je saurai :) J'ai trouvé le problème avec DependencyWalker ;)

0 votes

Pas d'inquiétude, il m'a épargné de nombreuses heures de réflexion, c'est un excellent outil ! :-)

1 votes

+1 à Keith Halligan pour avoir suggéré DependencyWalker. Il m'a indiqué que toutes les dépendances n'avaient pas le même type de CPU (x86/x64). J'ai copié tous les fichiers qui avaient le même type de CPU dans le dossier bin de mon application, et cela a résolu le problème.

60voto

Anthony Hayward Points 88

Vous pouvez utiliser l'outil dumpbin pour trouver les dépendances DLL requises :

dumpbin /DEPENDENTS my.dll

Cela vous indiquera quelles DLL votre DLL doit charger. Recherchez en particulier MSVCR*.dll. J'ai vu votre code d'erreur se produire lorsque le bon Redistribuable Visual C++ n'est pas installé.

Vous pouvez obtenir les "Visual C++ Redistributable Packages for Visual Studio 2013" sur le site Web de Microsoft. Il s'installe c : \windows\system32\MSVCR120.dll

Dans le nom du fichier, 120 = 12.0 = Visual Studio 2013.

Faites attention à ce que vous ayez la bonne version de Visual Studio (10.0 = VS 10, 11 = VS 2012, 12.0 = VS 2013...), la bonne architecture (x64 ou x86) pour la plateforme cible de votre DLL, et vous devez aussi faire attention aux debugs builds. Le build debug d'une DLL dépend de MSVCR120d.dll qui est une version debug de la bibliothèque, qui est installée avec Visual Studio mais pas par le Redistributable Package.

6 votes

L'ajout des redistribuables VS C++ a été suffisant pour moi ! J'avais besoin de la v10.0 (2010). Merci mucho !!!

0 votes

Existe-t-il un moyen de savoir si les versions 64 bits ou 32 bits des redistribuables sont nécessaires ?

1 votes

Dumpbin /ALL vous dira si mon.dll est x86 ou x64.

11voto

Headpuster Points 121

Essayez d'entrer le chemin complet de la dll. Si cela ne fonctionne pas, essayez de copier la dll dans le dossier system32.

3 votes

Est-il possible d'avoir toutes les dépendances dans le dossier System32 et ma dll ailleurs ?

0 votes

Les dépendances seront également recherchées dans l'ordre du chemin de recherche des dll de Windows, tel que spécifié par la commande stackoverflow.com/a/9003290/4434329

5voto

Felice Pollano Points 20105

Assurez-vous que toutes les dépendances de votre propre dll sont présentes près de la dll, ou dans System32 .

4voto

Chris O Points 3727

Activez la journalisation de la fusion, voir cette question pour obtenir de nombreux conseils sur la manière de procéder. Le débogage des problèmes de chargement des applications en mode mixte peut être une véritable plaie. La journalisation de la fusion peut être d'une grande aide.

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