J'ai une bibliothèque de dll avec un code API C ++ non managé que je dois utiliser dans mon application .NET 4.0. Mais chaque méthode que j'essaie de charger ma dll j'obtiens 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(string DBname, string DBuser_pass,
string WorkDirectory, ref StringBuilder ErrorMessage);
Quand j'ai essayé de suivre cet article et que j'exécute cet exemple (à partir du code téléchargé), il fonctionne sans problème (la dll utilisée se trouve dans le dossier bin / debug)
J'ai copié ma dll (avec tous les fichiers dont elle dépend dans mon dossier bin).
J'ai également essayé cette approche mais j'ai eu 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);
Aucune suggestion?
Vous pouvez utiliser l'outil dumpbin pour connaître les dépendances DLL requises:
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 redistribuable Visual C ++ correct n'est pas installé.
Vous pouvez obtenir les «packages redistribuables Visual C ++ pour Visual Studio 2013» sur le site Web de Microsoft. Il installe c: \ windows \ system32 \ MSVCR120.dll
Dans le nom de fichier, 120 = 12.0 = Visual Studio 2013.
Assurez-vous que vous avez 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 plate-forme cible de votre DLL, et vous devez également faire attention debug builds. La version de débogage d'une DLL dépend de MSVCR120d.dll qui est une version de débogage de la bibliothèque, qui est installée avec Visual Studio mais pas par le package redistribuable.
la source
debug
binaire, la version des redistribuables d'exécution C ++ doit être exactement la même que celle où vous l'avez construite.Ceci est un 'kludge' mais vous pouvez au moins l'utiliser pour tester la cohérence: essayez de coder en dur le chemin de la DLL dans votre code
Ayant dit cela; dans mon cas, exécuter
dumpbin /DEPENDENTS
comme suggéré par @ anthony-hayward, et copier des versions 32 bits des DLL listées ici 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 "ma" dll qui ne peut pas être chargée - ce sont les dépendances
la source
La DLL doit se trouver dans le dossier bin.
Dans Visual Studio, j'ajoute la dll à mon projet (PAS dans les références, mais "Ajouter un fichier existant"). Définissez ensuite la propriété «Copier dans le répertoire de sortie» de la dll sur «Copier si plus récent».
la source
Essayez d'entrer le chemin complet de la dll. Si cela ne fonctionne pas, essayez de copier la dll dans le dossier system32.
la source
Assurez-vous que toutes les dépendances de votre propre dll sont présentes à proximité de la dll ou dans
System32
.la source
Il y a une chose très drôle (et qui a une pertinence technique) qui pourrait vous faire perdre des heures alors pensé à la partager ici -
J'ai créé un projet d'application console
ConsoleApplication1
et un projet de bibliothèque de classesClassLibrary1
.Tout le code qui faisait l'invocation p / était présent dans
ClassLibrary1.dll
. Donc, avant de déboguer l'application depuis Visual Studio, j'ai simplement copié l'assembly non managé C ++myUnmanagedFunctions.dll
dans le\bin\debug\
répertoire duClassLibrary1
projet afin qu'il puisse être chargé au moment de l'exécution par le CLR.J'ai continué à recevoir le
erreur pendant des heures. Plus tard, j'ai réalisé que tous ces assemblys non gérés qui doivent être chargés doivent être copiés dans le
\bin\debug
répertoire du projet de démarrageConsoleApplication1
qui est généralement un formulaire gagnant, une console ou une application Web.Soyez donc prudent si la
Current Directory
réponse acceptée signifie en fait l'Current Directory
exécutable principal à partir duquel votre processus de candidature démarre. Cela semble évident, mais peut-être pas parfois.Leçon apprise - Placez toujours les dll non gérées dans le même répertoire que l'exécutable de démarrage pour vous assurer qu'il peut être trouvé.
la source
bin\Debug
et lesobj\Debug
répertoires et je continue à obtenir la « Impossible de DLL de charge »Activez la journalisation de la fusion, consultez cette question pour obtenir de nombreux conseils sur la façon de procéder. Le débogage des problèmes de chargement d'applications en mode mixte peut être une véritable douleur royale. La journalisation par fusion peut être d'une grande aide.
la source
Assurez-vous de définir la cible de la plate-forme de construction sur x86 ou x64 afin qu'elle soit compatible avec votre DLL - qui peut être compilée pour une plate-forme 32 bits.
la source
Si la DLL et les projets .NET sont dans la même solution et que vous souhaitez compiler et exécuter les deux à chaque fois, vous pouvez cliquer avec le bouton droit sur les propriétés du projet .NET, événements de génération, puis ajouter quelque chose comme ce qui suit à l'événement de post-génération ligne de commande:
C'est essentiellement une ligne DOS, et vous pouvez modifier en fonction de l'endroit où votre DLL est construite.
la source
J'ai eu le même problème lorsque j'ai déployé mon application pour tester le PC. Le problème était que le PC de développement avait
msvcp110d.dll
etmsvcr110d.dll
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.
la source
Dans mon cas, une DLL non gérée dépendait d'une autre qui manquait. Dans ce cas, l'erreur pointera vers la dll existante au lieu de celle manquante, ce qui peut être vraiment déroutant.
C'est exactement ce qui s'est passé dans mon cas. J'espère que ceci aide quelqu'un d'autre.
la source
Je pense que votre bibliothèque non gérée a besoin d'un manifeste.
Voici comment l'ajouter à votre binaire. et voici pourquoi.
En résumé, plusieurs versions de bibliothèques redistribuables peuvent être installées dans votre boîte, mais une seule d'entre elles devrait satisfaire votre application, et ce n'est peut-être pas la valeur par défaut, vous devez donc indiquer au système la version dont votre bibliothèque a besoin, c'est pourquoi le manifeste.
la source
Configuration : Windows 7 32 bits
Contexte : J'ai installé 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 a identifié plusieurs modules de dépendance manquants. Immédiatement, j'ai pensé que cela devait être une installation de pilote bâclé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 d'une mauvaise installation. J'ai dû supprimer manuellement quelques clés * .dll dans \ system32 et 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, le * .dll d'intérêt peut maintenant être référencé.
la source
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 un PC neuf.
ma dll cpp 32 bits (version en mode de sortie) fonctionnait bien avec le PC installé .NET mais pas avec le nouveau PC où j'ai eu l'erreur ci-dessous
enfin,
la source
Également confronté au même problème lors de l'utilisation d'un fichier dll c / c ++ non géré dans un environnement c #.
1.Vérifié la compatibilité de la DLL avec le processeur 32 bits ou 64 bits.
2.Vérifié les chemins corrects du dossier DLL .bin, system32 / sysWOW64 ou le chemin donné.
3.Vérifié si les fichiers PDB (base de données du programme) sont manquants. Cette vidéo vous donne une meilleure compréhension des fichiers pdb .
Lors de l'exécution de code binaire C / C ++ 32 bits dans un système 64 bits, cela peut survenir en raison d'une incompatibilité de plate-forme. Vous pouvez le modifier à partir de Build> Configuration manager.
la source
J'ai rencontré le même problème lors de l'importation de Dll C ++ dans .Net Framework +4, j'ai décoché Projet-> Propriétés-> Construire-> Préférer 32 bits et cela a été résolu pour moi.
la source