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

quand j'ajoute un .dll fichier comme référence dans C # application il montre une erreur:

Une référence à la "....dll" ne pouvait pas être ajouté.Assurez-vous que le fichier est accessible et qu'il s'agit d'une composant.

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

le module ""était chargé mais l'appel à DLLRegisterServer a échoué avec code d'erreur '0x80004005 '

j'utilise la version VS2010 ultimate sur une machine Windows 7 64bit. Quel pourrait être le problème?

Merci pour tous les conseils/réponses

82
demandé sur osvein 2010-08-11 12:50:06

15 réponses

ce qui suit a fonctionné pour moi:

réponse Courte

lancez la commande suivante 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éé pour vous.

plus longue réponse

  • Ouvrir cmd

  • Trouver 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 lancez:

    dir tlbimp.exe /s              //this will locate the file.
    
  • Exécuter tlbimp.exe et de mettre votre dll derrière elle. Exemple: si votre dll est cvextern.DLL. Vous pouvez lancer:

    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.
49
répondu Memet Olsen 2017-05-13 23:35:12

vous pouvez ajouter une DLL (ou EXE) à un projet seulement si c'est une assemblée .NET. Si ce n'est pas que vous verrez ce message d'erreur.

regsvr32 fait également certaines hypothèses sur la structure et la fonction exportée dans la DLL. Cela fait longtemps que je ne l'ai pas utilisé, mais il s'agit d'enregistrer des serveurs COM, donc 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.

Vous seule chance d'utiliser la DLL est d'importer comme toute autre non-.NET binaire, par exemple lorsque vous utilisez certains API Win32. Il y a un vieil Article de magazine MSDN qui pourrait être utile. Voir la mise à jour suivante pour savoir où trouver l'article.

mise à jour 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 s'intitule ".net Column: Calling Win32 DLLs in C# with P / Invoke". Il a été publié dans le numéro de juillet 2010 du magazine MSDN. Le " Wayback Machine "a l'article ici en ce moment (le formatage est limité). Le numéro entier du magazine MSDN juillet 2010 est disponible ici (format HCM seulement, instructions pour l'utilisation des fichiers HCM ici ).

14
répondu Manfred 2018-03-12 02:30:26

j'ai utilisé dependency walker pour vérifier les références internes que la dll avait. Il s'avère qu'il avait besoin du temps d'exécution VB msvbvm60.dll et puisque mon dev box n'a pas cela installé Je n'ai pas été en mesure de l'enregistrer en utilisant regsvr32

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

11
répondu user20358 2010-08-11 09:39:47

assurez-vous que votre compilateur est réglé sur x86 si vous essayez de faire référence à une dll x86...

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

je continuais à avoir des erreurs sur le fait que la bibliothèque D'accès n'était pas accessible, mais je savais que je l'avais chargée.

pendant le Debug, il m'est apparu que je compile pour 64 bits mais que J'ai Office x86 charger. Même si j'ai chargé la bibliothèque D'accès sur 32 bits, elle n'a jamais été utilisée par l'application... et que, par conséquent, n'est pas accessible.

voici ce que j'utilisais dans C#:

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

...Je recevais un message d'erreur

dès que j'ai commuté le compilateur à x86 il a fonctionné

6
répondu Robert Obergfoll 2015-01-07 14:42:59

je viens de tomber sur ce problème et après toutes les explications sur le fait de le corriger avec l'invite de commande j'ai trouvé que si vous l'Ajoutez directement au projet, vous pouvez alors simplement inclure la bibliothèque sur chaque page dont elle a besoin.""

2
répondu JeffB 2015-03-03 20:33:20

j'ai le même problème avec l'importation de WinSCard.dll dans mon projet. Je m'occupe de ce qui importe directement de dll comme ceci:

[DllImport("winscard.dll")]
public static extern int SCardEstablishContext(int dwScope, int pvReserved1, int pvReserved2, ref int phContext);

[DllImport("winscard.dll")]
public static extern int SCardReleaseContext(int phContext);

vous pouvez ajouter ceci au projet séparé et ensuite ajouter une référence à partir de votre projet principal.

2
répondu Sashus 2016-04-12 07:10:31

vous ne pouvez pas ajouter une référence à un natif DLL. Cependant, vous pouvez les inclure dans la solution (clic droit sur la solution, sélectionnez "Ajouter un fichier existant"), mais ils ne seront pas référencés sauf si vous déclarez quelque chose comme

[DllImport("...")]
public static extern void MyFunction();

peut-être qu'il y a une sorte de wrapper DLL, dont vous faites réellement référence et qui contient les importations DLL.

parfois, vous pouvez faire référence à la DLL enveloppante mais ne peut toujours pas faire fonctionner votre programme, où l'invite d'erreur vous suggère de vous assurer que le fichier existe et que toutes les dépendances sont disponibles.

ce problème est dû au fait que l'assemblage que vous essayez d'ajouter est ciblé et compilé uniquement pour une architecture de processeur x86 ou x64 .

essayez simplement de changer la plateforme cible en x86 ou x64 dans Construire - > Gestionnaire De Configuration .

1
répondu Leon Wolf 2017-07-21 08:16:54

j'ai fait face à un problème similaire. J'essayais d'ajouter la référence d'une dll .net 2.0 à un projet .net 1.1. Quand j'ai essayé d'ajouter une version précédente du .dll qui a été respectée dans .Net 1.1. il a travaillé pour moi.

0
répondu user2623151 2013-07-26 14:23:06

pour toute autre personne qui cherche de l'aide sur ce sujet, ou qui fait l'expérience D'un FileNotFoundException ou D'un FirstChanceException, consultez ma réponse ici:

a first chance exception of type 'System.IO.FileNotFoundException "s'est mscorlib.ni.dll -windows phone

en général, vous devez être absolument certain que vous répondez à toutes les exigences pour faire la référence - je sais que c'est la réponse évidente, mais vous négligez probablement une exigence relativement simple.

0
répondu JHaps 2017-05-23 12:18:22

j'ai eu ce problème après que mon PC ait été redémarré pendant la construction de la solution. Mes deux références ont disparu, donc j'ai dû reconstruire mes deux projets manuellement et ensuite j'ai pu ajouter des références sans erreur.

0
répondu Rafal Cypcer 2016-10-20 09:55:22

j'ai eu cette erreur en écrivant un Service Windows. J'exécutais Visual Studio en tant qu'administrateur pour que mes commandes post build installent automatiquement mon service. J'ai remarqué que lorsque j'ai tout fermé et que J'ai lancé VS normalement (pas en tant qu'administrateur), j'ai pu ajouter les références sans erreur.

espérons que cette solution fonctionne pour vous.

0
répondu Fütemire 2016-12-16 00:35:58

normalement dans Visual Studio 2015 vous devez créer le projet dll comme un projet C++ -> CLR à partir des modèles de Visual Studio, mais vous pouvez techniquement l'activer après le fait:

la propriété critique est appelée Common Language Runtime Support définie dans la configuration de votre projet. On le trouve sous Configuration Properties > General > Common Language Runtime Support .

en faisant cela, VS ne mettra probablement pas à jour l'option 'Target.NET Framework' (comme il devrait le faire). Vous pouvez l'ajouter manuellement en déchargeant votre projet, éditant le projet your_pro.xxproj fichier, et ajouter/mise à jour de la Target .NET framework Version balise XML.

pour un échantillon, je suggère de créer une nouvelle solution comme un projet CLR C++ et d'examiner le XML là-bas, peut-être même de le diffuser pour s'assurer qu'il n'y a rien de très important qui sort de l'ordinaire.

0
répondu Aaron Hull 2017-01-20 01:54:16

j'avais besoin de changer l'architecture en X86 de x64 En gestionnaire de configuration et de copier ma dll 32 bits (C language - pcProxAPI.dll) dans le nouveau dossier créé cette.. Ceci est en haut des étapes décrites par "Sashus" en dessous de .

C:\Projects..\bin\x86\Debug

0
répondu numbtongue 2017-09-26 19:13:35

Ma réponse est un peu tardive, mais comme un test rapide, assurez-vous que vous utilisez la dernière version de bibliothèques.

dans mon cas, après avoir mis à jour une bibliothèque nuget qui faisait référence à une autre bibliothèque causant le problème, le problème a disparu.

0
répondu Martin Staufcik 2018-03-17 15:27:29

j'ai eu le même problème lorsque j'ai essayé d'ajouter une dll que j'ai codée. Il s'est avéré que j'avais besoin de définir les propriétés du projet ma dll est de:

  • Configuration Properties\General\Common Language Runtime Support: /clr
  • Configuration Properties\C/C++\General\Common Language RunTime Support: /clr

parce que le projet dans lequel j'ai voulu utiliser cette dll a également été fixé comme cela (avait les mêmes propriétés fixées à /clr ).

0
répondu LoukMo 2018-07-30 15:16:52