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

J’ai une bibliothèque DLL avec un code API C ++ non géré que je dois utiliser dans mon application .NET 4.0. Mais chaque méthode que j’essaie de charger mon dll reçoit une erreur:

Impossible de charger la DLL ‘MyOwn.dll’: le module spécifié est introuvable. (Exception de HRESULT: 0x8007007E)

J’ai lu et essayé plusieurs solutions que j’ai trouvées sur 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(ssortingng DBname, ssortingng DBuser_pass, ssortingng WorkDirectory, ref SsortingngBuilder ErrorMessage); 

Lorsque j’ai essayé de suivre cet article et que je lance cet exemple (à partir du code téléchargé), il s’exécute sans problème (la DLL utilisée se trouve dans le dossier bin / debug)

J’ai copié mon dll (avec tous les fichiers dont il dépend dans mon dossier bin).

J’ai aussi essayé cette approche mais j’ai eu la même erreur:

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

Aucune suggestion?

De ce que je me souviens de Windows, l’ordre de recherche d’une DLL est:

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

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

Vous pouvez utiliser l’outil dumpbin pour rechercher les dépendances DLL requirejses:

 dumpbin /DEPENDENTS my.dll 

Cela vous indiquera les DLL que votre DLL doit charger. Faites particulièrement attention à MSVCR * .dll. J’ai vu votre code d’erreur se produire lorsque le Visual C ++ Redissortingbutable correct n’est pas installé.

Vous pouvez obtenir les “Packages redissortingbuables Visual C ++ pour Visual Studio 2013” sur le site Web de Microsoft. Il installe c: \ windows \ system32 \ MSVCR120.dll

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

Veillez à disposer de la bonne version de Visual Studio (10.0 = VS 10, 11 = VS 2012, 12.0 = VS 2013 …) pour la plate-forme cible de votre DLL (x64 ou x86). le débogage construit. La version de débogage d’une DLL dépend de MSVCR120d.dll, qui est une version de débogage de la bibliothèque, installée avec Visual Studio, mais pas par le package redissortingbuable.

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

La DLL doit être dans le dossier bin.

Dans Visual Studio, j’ajoute la DLL à mon projet (PAS dans References, mais “Ajouter un fichier existant”). Ensuite, définissez la propriété “Copier dans le répertoire de sortie” pour la DLL sur “Copier si plus récent”.

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

Il y a une chose très drôle (et qui a une pertinence technique) qui pourrait vous faire perdre des heures, alors pensez à la partager ici –

J’ai créé un projet d’application console ConsoleApplication1 et un projet de bibliothèque de classes ClassLibrary1 .

Tout le code qui faisait le p / invoke était présent dans ClassLibrary1.dll . Donc, avant de déboguer l’application de Visual Studio, j’ai simplement copié l’assembly non géré C ++ ( myUnmanagedFunctions.dll ) dans le myUnmanagedFunctions.dll \bin\debug\ du projet ClassLibrary1 afin qu’il puisse être chargé au moment de l’exécution par le CLR.

J’ai continué à obtenir le

Impossible de charger la DLL

erreur pendant des heures. Plus tard, j’ai réalisé que tous les assemblages non gérés à charger doivent être copiés dans le répertoire \bin\debug du projet de ConsoleApplication1 qui est généralement un formulaire gagnant, une console ou une application Web.

Donc, soyez prudent, le Current Directory dans la réponse acceptée signifie en fait Current Directory du fichier exécutable principal à partir duquel le processus d’application démarre. On dirait une chose évidente mais peut-être pas parfois.

Leçon apprise – Placez toujours les DLL non analysées dans le même répertoire que l’exécutable de démarrage pour vous assurer qu’elles peuvent être trouvées.

Ceci est un “kludge” mais vous pourriez au moins l’utiliser pour le test de santé mentale: Essayez de coder en dur le chemin d’access à la DLL dans votre code

 [DllImport(@"C:\\mycompany\\MyDLL.dll")] 

Ayant dit cela; dans mon cas, exécuter dumpbin /DEPENDENTS comme suggéré par @ anthony-hayward, et copier sur des versions 32 bits des DLL listées dans mon répertoire de travail a résolu ce problème pour moi.

Le message est juste un peu trompeur, car ce n’est pas “mon” dll qui ne peut pas être chargé – ce sont les dépendances

Activez la journalisation de la fusion, consultez cette question pour obtenir de nombreux conseils sur la manière de procéder. Déboguer des problèmes de chargement d’applications en mode mixte peut être un problème royal. La journalisation de fusion peut être d’une grande aide.

Assurez-vous de définir la cible de plate-forme de génération sur x86 ou x64 pour qu’elle soit compatible avec votre DLL – qui pourrait être compilée pour une plate-forme 32 bits.

Si la DLL et les projets .NET se trouvent dans la même solution et que vous souhaitez les comstackr et les exécuter à chaque fois, vous pouvez cliquer avec le bouton droit sur les propriétés du projet .NET, puis créer des événements, puis append quelque chose comme suit à l’événement ligne de commande:

 copy $(SolutionDir)Debug\MyOwn.dll . 

Il s’agit essentiellement d’une ligne DOS et vous pouvez modifier en fonction de l’emplacement de votre DLL.

J’ai eu le même problème lorsque j’ai déployé mon application pour tester le PC. Le problème était le développement PC avait msvcp110d.dll et msvcr110d.dll mais pas le PC de test.

J’ai ajouté le module de fusion “Visual Studio C ++ 11.0 DebugCRT (x86)” dans InstalledSheild et cela a fonctionné. J’espère que cela sera utile pour quelqu’un d’autre.

Configuration : Windows 7 32 bits

Contexte : Installation d’un pilote PCI-GPIB, avec lequel je n’ai pas pu communiquer en raison du problème susmentionné.

Réponse courte : réinstallez le pilote.

Réponse longue : J’ai également utilisé Dependency Walker , qui identifiait plusieurs modules de dépendance manquants. Immédiatement, j’ai pensé que c’était une installation de pilote ratée. Je ne voulais pas vérifier et restaurer chaque fichier manquant.

Le fait que je n’ai pas pu trouver le programme de désinstallation sous Programmes et fonctionnalités du Panneau de configuration est un autre indicateur de mauvaise installation. J’ai dû supprimer manuellement un couple de * .dll dans \ system32 et les clés de registre pour permettre la réinstallation du pilote.

Problème résolu

La partie inattendue était que tous les modules de dépendance n’étaient pas résolus. Néanmoins, les * .dll d’intérêt peuvent maintenant être référencés.

J’ai rencontré le même problème, dans mon cas, j’avais deux PC 32 bits. L’un avec .NET4.5 installé et l’autre était PC frais.

mon cpp dll 32 bits (version en mode release) fonctionnait bien avec le PC installé sur .NET mais pas avec le nouveau PC où j’ai eu l’erreur

Impossible de charger la DLL ‘PrinterSettings.dll’: le module spécifié est introuvable. (Exception de HRESULT: 0x8007007E)

enfin,

Je viens de construire mon projet dans la configuration du mode Debug et cette fois, cpp dll fonctionnait bien.

Je pense que votre bibliothèque non gérée nécessite un manifeste.
Voici comment l’append à votre binary. et voici pourquoi.

En résumé, plusieurs versions de la bibliothèque Redissortingbutable peuvent être installées dans votre boîte, mais une seule d’entre elles devrait satisfaire votre application, et ce pourrait ne pas être la valeur par défaut. Vous devez donc indiquer au système la version dont votre bibliothèque a besoin.