102 votes

Une référence à la dll n'a pu être ajoutée

Lorsque j'ajoute un fichier .dll comme référence dans une application C#, une erreur apparaît :

Une référence à la "....dll" n'a pas pu être ajoutée. le fichier est accessible et qu'il s'agit d'un assemblage ou d'un composant COM valide. valide.

ILDissassembler dit qu'il n'y a pas d'en-tête CLR valide alors j'essaie de l'enregistrer en utilisant regsvr32 et cela me donne une autre erreur :

Le module "" a été chargé mais l'appel à DLLRegisterServer a échoué avec un code d'erreur '0x80004005'.

J'utilise la version ultime de VS2010 sur une machine Windows 7 64 bits. Quel pourrait être le problème ?

Merci pour tout conseil/réponse

54voto

Memet Olsen Points 1642

Ce qui suit a fonctionné pour moi :

Réponse courte

Exécutez ce qui suit via la ligne de commande (cmd) :

TlbImp.exe cvextern.dll        //where cvextern.dll is your dll you want to fix.

Et une dll valide sera créée pour vous.

Réponse plus longue

  • Ouvrir cmd

  • Trouvez TlbImp.exe. Probablement situé dans C:\Program Fichiers (x86) \Microsoft SDKs \Windows\v7.0A\Bin. Si vous ne le trouvez pas, allez dans votre dossier racine (C:³ ou D :) et exécutez-le :

    dir tlbimp.exe /s              //this will locate the file.
  • Exécutez tlbimp.exe et mettez votre dll derrière. Exemple : Si votre dll est cvextern.dll. Vous pouvez exécuter :

    TlbImp.exe cvextern.dll
  • Une nouvelle dll a été créée dans le même dossier que tlbimp.exe. Vous pouvez l'utiliser comme référence dans votre projet.

5 votes

Une autre façon d'accéder à TlbImp.exe est d'ouvrir une invite de commande Visual Studio.

79 votes

@Memet Après avoir essayé ceci, j'ai obtenu, TlbImp : error TI0000 : The input file 'c:\Program Files\Microsoft SDKs\Windows\ v7.0A\bin\MyLibrary.dll' is not a valid type library. Des suggestions ?

0 votes

@user34567890 J'étais bloqué là depuis quelques jours maintenant. J'essaie d'envelopper la dll dans un wrapper VB6.0 et de l'utiliser dans .Net. Mais toujours pas de chance et je me demande si je suis sur la bonne voie...

24voto

Manfred Points 2625

Vous pouvez ajouter une DLL (ou un EXE) à un projet uniquement s'il s'agit d'une assembly .NET. Si ce n'est pas le cas, vous verrez apparaître ce message d'erreur.

regsvr32 fait également certaines suppositions sur la structure et la fonction exportée dans la DLL. Cela fait un moment que je ne l'ai pas utilisé mais il s'agit d'enregistrer des serveurs COM et certains points d'entrée doivent être disponibles. Si regsvr32 échoue, la DLL ne fournit pas ces points d'entrée et la DLL ne contient pas de composant COM.

Votre seule chance d'utiliser la DLL est de l'importer comme tout autre binaire non .NET, par exemple lorsque vous utilisez certaines API Win32. Il existe un ancien article du magazine MSDN qui pourrait vous être utile. Voir la mise à jour suivante pour savoir où obtenir l'article.

Mise à jour du 12 mars 2018 : Le lien vers le magazine MSDN ne fonctionne plus comme il le faisait en août 2010. L'article de Jason Clark est intitulé " .NET Column : Calling Win32 DLLs in C# with P/Invoke". Il a été publié dans le numéro de juillet 2010 de MSDN Magazine. L'article est disponible sur la "Wayback Machine". aquí pour le moment (le formatage est limité). L'intégralité du numéro de juillet 2010 de MSDN Magazine est disponible aquí (format HCM uniquement, instructions pour l'utilisation des fichiers HCM aquí ).

1 votes

Existe-t-il un moyen de s'assurer que le compilateur place un fichier .dll dans le dossier de sortie même s'il ne s'agit pas d'une référence ?

2 votes

@KyleDelaney Je ne pense pas que le compilateur puisse faire cela. J'envisagerais de mettre une commande copy ou xcopy dans l'événement pré-build/post-build du projet/solution. C'est manuel, cependant, mais généralement les références ne changent pas trop souvent et une suite de tests appropriée devrait attraper les cas où vous avez oublié de mettre à jour les commandes exécutées dans l'événement pré-build/post-build.

0 votes

Merci pour la réponse !

13voto

user20358 Points 3015

J'ai utilisé dependency walker pour vérifier les références internes que la dll avait. Il s'avère qu'elle a besoin du runtime VB msvbvm60.dll et comme ma boîte de développement ne l'a pas installé, je n'ai pas pu l'enregistrer en utilisant regsvr32.

Cela semble être la réponse à ma question initiale pour le moment.

0 votes

Dans mon cas, j'ai dû supprimer le dossier obj du projet que j'essayais de référencer, puis j'ai reconstruit le projet.

7voto

Assurez-vous que votre compilateur est réglé sur x86 si vous essayez de référencer une dll x86...

J'avais des problèmes similaires... comme mentionné ci-dessus, en essayant d'utiliser OLEDB pour accéder à un fichier Excel à partir de mon code C# dans Visual Studio 2012.

Je continuais à obtenir des erreurs indiquant que la bibliothèque Access n'était pas accessible, mais je savais que je l'avais chargée.

Pendant le débogage, je me suis rendu compte que je compilais pour 64 bits mais que j'avais chargé Office x86. Même si j'ai chargé la bibliothèque Access pour 32 bits, elle n'a jamais été utilisée par l'application... et n'était donc pas accessible.

Voici ce que j'utilisais en C# :

"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + strFilePath + ";Extended Properties='Excel 12.0 Xml;HDR=Yes'" ;

...Je recevais une erreur

Dès que j'ai changé le compilateur en x86, ça a marché.

1voto

Noha Kareem Points 674

J'ai eu une expérience similaire lorsque j'ai essayé d'ajouter une "Référence" au projet. Pour être précis, l'erreur était la suivante :
"Une référence à {répertoire} \opencv_core24l.dll n'a pas pu être ajouté. Veuillez vous assurer que le fichier est accessible et qu'il s'agit d'un assemblage ou d'un composant COM valide."

Les DLL ont toutefois été ajoutées sans problème dans ce cas lorsque je les ai ajoutées en tant qu'élément existant :

  1. cliquez à droite sur le nom du projet
  2. ajouter un élément existant
  3. choisissez les dlls dans le répertoire nécessaire.

J'ai trouvé cela à la page 3 du document pdf dont le lien figure ci-dessous (). Les DLL que j'ai incluses étaient opencv_core{version number}.dll et opencv_imgproc{version number}.dll d'un projet C# emguCV sur VS2010 Express (utilisant également Windows 7 64 bits).

C'est la référence qui m'a aidé ; elle présente comment inclure les bibliothèques nécessaires dans un projet EmguCV C#.
http://www.fcih.net/ayman/main/images/AHCI/CSC399_Starting_Emgu_CV.pdf

J'espère que cela vous aidera.

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