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

95

Lorsque j'ajoute un fichier .dll comme référence dans l'application C #, une erreur s'affiche:

Une référence à la ".... dll" n'a pas pu être ajoutée. Assurez-vous que le fichier est accessible et qu'il s'agit d'un assemblage ou d'un composant COM 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 le 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 tous les indices / réponses

user20358
la source

Réponses:

53

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 Files (x86) \ Microsoft SDKs \ Windows \ v7.0A \ Bin. Si vous ne le trouvez pas, allez dans votre dossier racine (C: \ ou D :) et exécutez:

    dir tlbimp.exe /s              //this will locate the file.
  • Exécutez tlbimp.exe et placez votre DLL derrière. Exemple: si votre dll est cvextern.dll. Tu peux courir:

    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.
Memet Olsen
la source
5
Une autre façon d'accéder à TlbImp.exe consiste à ouvrir une invite de commandes Visual Studio.
Scott
75
@Memet Afer essayant ceci que j'ai eu, des TlbImp : error TI0000 : The input file 'c:\Program Files\Microsoft SDKs\Windows\ v7.0A\bin\MyLibrary.dll' is not a valid type library.suggestions?
Dineshkumar
1
Le fichier d'entrée C: \ Windows \ SYSTEM32 \ SqlServerSpatial.dll 'n'est pas une bibliothèque de types valide
Christine
7
Ayant la même erreur que celle déclarée par Dineshkumar Ponnusamy. Aidez-moi s'il vous plaît
deathrace
1
Quand auriez-vous besoin d'utiliser TLBMP? Normalement dans VS2015, si vous ajoutez simplement la référence à la DLL COM à partir de la fenêtre de références, il s'occupe de tout cela pour vous.
UuDdLrLrSs
20

Vous pouvez ajouter une DLL (ou EXE) à un projet uniquement s'il s'agit d'un assembly .NET. Si ce n'est pas le cas, 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 un moment que je ne l'ai pas utilisé, mais cela a à voir avec l'enregistrement 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.

La seule chance d'utiliser la DLL est de l'importer comme n'importe quel autre binaire non-.NET, par exemple lorsque vous utilisez certaines API Win32. Il existe un ancien article du magazine MSDN qui pourrait être utile. Consultez 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 avant en août 2010. L'article de Jason Clark s'intitule «Colonne .NET: Appel de DLL Win32 en C # avec P / Invoke». Il a été publié dans le numéro de juillet 2010 de MSDN Magazine. La "Wayback Machine" a l'article ici pour le moment (le formatage est limité). Le numéro complet de MSDN Magazine de juillet 2010 est disponible ici (format HCM uniquement, instructions d'utilisation des fichiers HCM ici ).

Manfred
la source
Existe-t-il un moyen de s'assurer que le compilateur place un .dll dans le dossier de sortie même s'il ne s'agit pas d'une référence?
Kyle Delaney
1
@KyleDelaney Je ne pense pas que le compilateur puisse faire ça. 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 en général les références ne changent pas trop souvent et une suite de tests appropriée devrait détecter les cas où vous avez oublié de mettre à jour les commandes exécutées dans l'événement pré-build / post-build.
Manfred
Merci pour la réponse!
Kyle Delaney
Le lien vers l'article est mort.
Roald
@Roald Merci. Oui, le lien est effectivement rompu. Microsoft fournit uniquement le format HCM de l'ensemble du numéro de MSDN Magazine à une URL différente. La Wayback Machine a également un instantané de l'article au format HTML avec une apparence simplifiée. J'ai mis à jour la réponse pour refléter cela et j'ai également supprimé le lien rompu de ma réponse. J'espère que cela t'aides.
Manfred
12

J'ai utilisé le walker de dépendance pour vérifier les références internes de la dll. Il s'avère qu'il avait 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.

user20358
la source
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.
Tolu
7

Assurez-vous que votre compilateur est défini 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.

J'ai continué à recevoir des erreurs concernant la bibliothèque Access n'étant pas accessible mais je savais que je l'avais chargée.

Pendant le débogage, il m'est apparu que je compile pour 64 bits mais que Office x86 est chargé. 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 basculé le compilateur sur x86, cela a fonctionné

Robert Obergfoll
la source
2

Je viens de rencontrer ce problème et après toutes les explications sur sa résolution avec l'invite de commande, j'ai trouvé que si vous l'ajoutez directement au projet, vous pouvez simplement inclure la bibliothèque sur chaque page dont elle a besoin

JeffB
la source
2

J'ai le même problème avec l'importation de WinSCard.dll dans mon projet. Je traite cela en important directement à partir 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 l'ajouter pour séparer le projet, puis ajouter une référence à votre projet principal.

Sashus
la source
1

J'ai eu ce problème après le redémarrage de mon PC lors de la création de la solution. Mes deux références ont disparu, j'ai donc dû reconstruire mes deux projets manuellement et ensuite j'ai pu ajouter des références sans erreur.

Rafal Cypcer
la source
1

Vous ne pouvez pas ajouter de référence à une DLL native . 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();

Il existe peut-être une sorte de DLL wrapper , que vous référencez en fait et qui contient les importations DLL.

Parfois, vous pouvez référencer la DLL du wrapper mais ne pouvez toujours pas exécuter votre programme, où une 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'assembly que vous essayez d'ajouter est ciblé et compilé uniquement pour une architecture de processeur x86 ou x64 .

Essayez simplement de changer la plate-forme cible en x86 ou x64 dans Build -> Configuration Manager .

Léon Wolf
la source
1

J'avais besoin de changer l'architecture en x86 à partir de x64 dans le gestionnaire de configuration et de copier mon dll 32 bits (langage C - pcProxAPI.dll) dans le nouveau dossier que cela a créé .. Ceci est en plus des étapes décrites par "Sashus" ci-dessous .

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

boateng
la source
C'était lui aussi un problème pour moi.
rogue39nin
mais si la valeur par défaut n'est pas x86 ni x64? mais .... "Any Cpu" est apparu ...?
gumuruh
codeproject.com/articles/1160645/… N'importe quel processeur peut également fonctionner si vous y copiez la dll 32 bits
boateng
1

J'ai eu le même problème lorsque j'ai essayé d'ajouter une dll que je viens de coder en C ++ à mon nouveau projet C #. Il s'est avéré que j'avais besoin de définir les propriétés du projet C ++ dont ma dll provient:

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

Parce que le projet C # dans lequel je voulais utiliser cette dll était également défini comme ça (avait les mêmes propriétés définies sur /clr).

LoukMouk
la source
Explorateur de solutions> Propertise> Propriétés de configuration
Yuresh Karunanayake
@gumuruh Si vous voulez dire "qu'est-ce que clr?", alors CLR est docs.microsoft.com/en-us/dotnet/standard/clr
LoukMouk
0

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 était conforme à .Net 1.1. cela a fonctionné pour moi.

user2623151
la source
0

Pour toute personne cherchant de l'aide à ce sujet, ou rencontrant une FileNotFoundException ou une FirstChanceException, consultez ma réponse ici:

Une exception de première chance de type «System.IO.FileNotFoundException» s'est produite dans mscorlib.ni.dll - Windows Phone

En général, vous devez être absolument certain que vous remplissez toutes les conditions requises pour faire la référence - je sais que c'est la réponse évidente, mais vous oubliez probablement une exigence relativement simple.

JHaps
la source
Examinez les différences entre les versions de framework par rapport à la référence - la plupart du temps, l'utilisation d'une nouvelle version de framework ne devrait pas faire de différence.
JHaps
0

J'ai eu cette erreur lors de l'écriture d'un service Windows. J'exécutais Visual Studio en tant qu'administrateur afin que mes commandes de post build installent automatiquement mon service. J'ai remarqué que lorsque j'ai tout fermé et exécuté VS normalement (pas en tant qu'administrateur), cela m'a permis d'ajouter les références très bien sans erreur.

J'espère que cette solution fonctionne pour vous.

Fütemire
la source
0

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

La propriété critique est appelée Common Language Runtime Supportset dans la configuration de votre projet. Il se trouve sous Configuration Properties > General > Common Language Runtime Support.

Lors de cette opération, VS ne mettra probablement pas à jour l'option «Target .NET Framework» (comme il se doit). Vous pouvez l'ajouter manuellement en déchargeant votre projet, en éditant le fichier your_project.xxproj et en ajoutant / mettant à jour la Target .NET framework Versionbalise XML.

Pour un exemple, je suggère de créer une nouvelle solution en tant que projet C ++ CLR et d'y examiner le XML, peut-être même de le différencier pour s'assurer qu'il n'y a rien de très important qui sort de l'ordinaire.

Aaron Hull
la source
0

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

Dans mon cas, après la mise à jour d'une bibliothèque nuget qui faisait référence à une autre bibliothèque à l'origine du problème, le problème a disparu.

Martin Staufcik
la source
0

Vous pouvez ajouter un fichier .dll manuellement. Par exemple, si vous souhaitez ajouter un fichier dll dans votre application WPF et que vous ne parvenez pas à le référencer dans votre projet

(Obtention d'erreur: une référence à la ".... dll" n'a pas pu être ajoutée. Veuillez vous assurer que le fichier est accessible et qu'il s'agit d'un assemblage ou d'un composant COM valide),

puis COPY ce fichier dll et COLLER dans le PROJET INSTALLATEUR (dans le dossier de l'application).

ARUN JOHN
la source
0
  1. démarrez cmd.exe et tapez:
  2. Regsvr32% chemin dll%
  3. "% dllpath%" remplace le chemin de votre dll
charles chen
la source