Ein Verweis auf die DLL konnte nicht hinzugefügt werden

95

Wenn ich eine DLL-Datei als Referenz in die C # -Anwendung einfüge, wird ein Fehler angezeigt:

Ein Verweis auf die ".... dll" konnte nicht hinzugefügt werden. Bitte stellen Sie sicher, dass auf die Datei zugegriffen werden kann und dass es sich um eine gültige Assembly- oder COM-Komponente handelt.

ILDissassembler sagt, dass es keinen gültigen CLR-Header gibt, also versuche ich, ihn mit regsvr32 zu registrieren, und das gibt mir einen weiteren Fehler:

Das Modul "" wurde geladen, aber der Aufruf von DLLRegisterServer schlug mit dem Fehlercode '0x80004005' fehl.

Ich verwende die ultimative VS2010-Version auf einem 64-Bit-Windows 7-Computer. Was könnte das Problem sein?

Vielen Dank für alle Hinweise / Antworten

user20358
quelle

Antworten:

53

Folgendes hat bei mir funktioniert:

Kurze Antwort

Führen Sie Folgendes über die Befehlszeile (cmd) aus:

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

Und eine gültige DLL wird für Sie erstellt.

Längere Antwort

  • Öffnen Sie cmd

  • Finden Sie TlbImp.exe. Befindet sich wahrscheinlich in C: \ Programme (x86) \ Microsoft SDKs \ Windows \ v7.0A \ Bin. Wenn Sie es nicht finden können, gehen Sie zu Ihrem Stammordner (C: \ oder D :) und führen Sie Folgendes aus:

    dir tlbimp.exe /s              //this will locate the file.
  • Führen Sie tlbimp.exe aus und setzen Sie Ihre DLL dahinter. Beispiel: Wenn Ihre DLL cvextern.dll ist. Du kannst rennen:

    TlbImp.exe cvextern.dll
  • Eine neue DLL wurde im selben Ordner von tlbimp.exe erstellt. Sie können dies als Referenz in Ihrem Projekt verwenden.
Memet Olsen
quelle
5
Eine andere Möglichkeit, auf TlbImp.exe zuzugreifen, besteht darin, eine Visual Studio-Eingabeaufforderung zu öffnen.
Scott
75
@Memet Wenn ich das versuche, habe ich TlbImp : error TI0000 : The input file 'c:\Program Files\Microsoft SDKs\Windows\ v7.0A\bin\MyLibrary.dll' is not a valid type library.irgendwelche Vorschläge?
Dineshkumar
1
Die Eingabedatei C: \ Windows \ SYSTEM32 \ SqlServerSpatial.dll 'ist keine gültige Typbibliothek
Christine
7
Mit dem gleichen Fehler wie von Dineshkumar Ponnusamy angegeben. Bitte helfen Sie mir aus
Deathrace
1
Wann müssten Sie TLBMP verwenden? Normalerweise erledigt VS2015 dies alles für Sie, wenn Sie nur den Verweis auf die COM-DLL aus dem Verweisfenster hinzufügen.
UuDdLrLrSs
20

Sie können einem Projekt nur dann eine DLL (oder EXE) hinzufügen, wenn es sich um eine .NET-Assembly handelt. Wenn dies nicht der Fall ist, wird diese Fehlermeldung angezeigt.

regsvr32 macht auch bestimmte Annahmen über die Struktur und die exportierte Funktion in der DLL. Es ist eine Weile her, seit ich es verwendet habe, aber es hat mit der Registrierung von COM-Servern zu tun, sodass bestimmte Einstiegspunkte verfügbar sein müssen. Wenn regsvr32 fehlschlägt, stellt die DLL diese Einstiegspunkte nicht bereit und die DLL enthält keine COM-Komponente.

Die einzige Möglichkeit, die DLL zu verwenden, besteht darin, sie wie jede andere Nicht-.NET-Binärdatei zu importieren, z. B. wenn Sie bestimmte Win32-APIs verwenden. Es gibt einen alten Artikel im MSDN-Magazin, der hilfreich sein könnte. Informationen zum Bezugsquellen des Artikels finden Sie im folgenden Update.

Update 12. März 2018: Der Link zum MSDN-Magazin funktioniert nicht mehr wie im August 2010. Der Artikel von Jason Clark trägt den Titel ".NET-Spalte: Aufrufen von Win32-DLLs in C # mit P / Invoke". Es wurde in der Juli 2010 Ausgabe des MSDN Magazine veröffentlicht. Die "Wayback Machine" hat den Artikel hier im Moment (Formatierung ist begrenzt). Die gesamte Ausgabe des MSDN-Magazins vom Juli 2010 finden Sie hier (nur HCM-Format, Anweisungen zur Verwendung von HCM-Dateien hier ).

Manfred
quelle
Gibt es eine Möglichkeit, um sicherzustellen, dass der Compiler eine DLL in den Ausgabeordner legt, auch wenn es sich nicht um eine Referenz handelt?
Kyle Delaney
1
@ KyleDelaney Ich glaube nicht, dass der Compiler das kann. Ich würde in Betracht ziehen, einen Befehl copy oder xcopy in das Pre-Build / Post-Build-Ereignis des Projekts / der Lösung einzufügen. Es ist zwar manuell, aber im Allgemeinen ändern sich Referenzen nicht zu oft, und eine geeignete Testsuite sollte die Fälle erfassen, in denen Sie vergessen haben, die im Pre-Build- / Post-Build-Ereignis ausgeführten Befehle zu aktualisieren.
Manfred
Danke für die Antwort!
Kyle Delaney
Der Link zum Artikel ist tot.
Roald
@ Robert Danke. Ja, die Verbindung ist tatsächlich unterbrochen. Microsoft stellt das HCM-Format der gesamten Ausgabe des MSDN Magazine nur unter einer anderen URL zur Verfügung. Die Wayback-Maschine hat auch eine Momentaufnahme nur des Artikels im HTML-Format mit einem vereinfachten Erscheinungsbild. Ich habe die Antwort aktualisiert, um dies widerzuspiegeln, und ich habe auch den defekten Link aus meiner Antwort entfernt. Hoffe das hilft.
Manfred
12

Ich habe Dependency Walker verwendet, um die internen Referenzen der DLL zu überprüfen. Es stellte sich heraus, dass die VB-Laufzeit msvbvm60.dll benötigt wurde, und da meine Entwicklungsbox diese nicht installiert hat, konnte ich sie nicht mit regsvr32 registrieren

Das scheint vorerst die Antwort auf meine ursprüngliche Frage zu sein.

user20358
quelle
In meinem Fall musste ich den Ordner obj für das Projekt löschen, auf das ich verweisen wollte, und dann habe ich das Projekt neu erstellt.
Tolu
7

Stellen Sie sicher, dass Ihr Compiler auf x86 eingestellt ist, wenn Sie versuchen, auf eine x86-DLL zu verweisen ...

Ich hatte ähnliche Probleme ... wie oben erwähnt, als ich versuchte, mit OLEDB über meinen C # -Code in Visual Studio 2012 auf eine Excel-Datei zuzugreifen.

Ich bekam immer wieder Fehler, dass die Access-Bibliothek nicht zugänglich war, aber ich wusste, dass ich sie geladen hatte.

Während des Debuggens wurde mir klar, dass ich für 64-Bit kompiliere, aber Office x86 geladen habe. Obwohl ich die Access-Bibliothek für 32 Bit geladen habe, wurde sie von der App nie verwendet ... und war daher nicht zugänglich.

Folgendes habe ich in C # verwendet:

"Provider = Microsoft.ACE.OLEDB.12.0; Datenquelle =" + strFilePath + "; Erweiterte Eigenschaften = 'Excel 12.0 Xml; HDR = Ja'";

... Ich habe einen Fehler bekommen

Sobald ich den Compiler auf x86 umgestellt habe, hat es funktioniert

Robert Obergfoll
quelle
2

Ich bin gerade auf dieses Problem gestoßen und nach all den Erklärungen zum Beheben mit der Eingabeaufforderung habe ich festgestellt, dass Sie, wenn Sie es direkt zum Projekt hinzufügen, einfach die Bibliothek auf jeder Seite einfügen können, die benötigt wird

JeffB
quelle
2

Ich habe das gleiche Problem beim Importieren von WinSCard.dll in mein Projekt. Ich beschäftige mich mit dem Import direkt aus der DLL wie folgt:

[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);

Sie können dies zu einem separaten Projekt hinzufügen und dann eine Referenz aus Ihrem Hauptprojekt hinzufügen.

Sashus
quelle
1

Ich hatte dieses Problem, nachdem mein PC während der Erstellung der Lösung neu gestartet wurde. Meine beiden Referenzen waren weg, daher musste ich meine beiden Projekte manuell neu erstellen und konnte dann ohne Fehler Referenzen hinzufügen.

Rafal Cypcer
quelle
1

Sie können keinen Verweis auf eine native DLL hinzufügen . Sie können sie jedoch in die Lösung aufnehmen (Rechtsklick auf Lösung, wählen Sie "Vorhandene Datei hinzufügen"), aber sie werden nur referenziert, wenn Sie so etwas deklarieren

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

Vielleicht gibt es eine Art Wrapper- DLL, auf die Sie tatsächlich verweisen und die die DLL-Importe enthält.

Manchmal verweisen Sie möglicherweise auf die Wrapper-DLL, können Ihr Programm jedoch nicht ausführen. Die Fehleraufforderung schlägt vor, sicherzustellen, dass die Datei vorhanden ist und alle Abhängigkeiten verfügbar sind.

Dieses Problem liegt daran, dass die Assembly, die Sie hinzufügen möchten, nur für eine x86- oder x64- Prozessorarchitektur ausgewählt und kompiliert wird .

Versuchen Sie einfach, die Zielplattform in Build -> Configuration Manager auf x86 oder x64 zu ändern .

Leon Wolf
quelle
1

Ich musste die Architektur im Konfigurationsmanager von x64 auf x86 ändern und meine 32-Bit-DLL (C-Sprache - pcProxAPI.dll) in einen neuen Ordner kopieren, der erstellt wurde. Dies ist zusätzlich zu den von "Sashus" unten beschriebenen Schritten .

C: \ Projekte .. \ bin \ x86 \ Debug

boateng
quelle
Das war er auch für mich.
Rogue39nin
aber wenn der Standard nicht x86 oder x64 ist? aber ... "Any Cpu" ist aufgetaucht ...?
Gumuruh
codeproject.com/articles/1160645/… Jede CPU kann auch funktionieren, wenn Sie die 32-Bit-DLL dort
kopieren
1

Ich hatte das gleiche Problem, als ich versuchte, meinem neuen C # -Projekt eine gerade in C ++ codierte DLL hinzuzufügen. Es stellte sich heraus, dass ich Eigenschaften des C ++ - Projekts festlegen musste, aus dem meine DLL stammt:

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

Weil das C # -Projekt, in dem ich diese DLL verwenden wollte, auch so eingestellt war (hatte die gleichen Eigenschaften eingestellt /clr).

LoukMouk
quelle
Projektmappen-
@gumuruh Wenn Sie "Was ist Clr?" meinen, dann ist CLR docs.microsoft.com/en-us/dotnet/standard/clr
LoukMouk
0

Ich hatte ein ähnliches Problem. Ich habe versucht, die Referenz einer .net 2.0-DLL zu einem .Net 1.1-Projekt hinzuzufügen. Als ich versuchte, eine frühere Version der DLL hinzuzufügen, die in .Net 1.1 eingehalten wurde. es hat bei mir funktioniert.

user2623151
quelle
0

Wenn Sie in dieser Angelegenheit Hilfe suchen oder eine FileNotFoundException oder eine FirstChanceException haben, lesen Sie meine Antwort hier:

In mscorlib.ni.dll - Windows Phone ist eine erste Chance vom Typ 'System.IO.FileNotFoundException' aufgetreten

Im Allgemeinen müssen Sie absolut sicher sein, dass Sie alle Anforderungen für die Erstellung der Referenz erfüllen - ich weiß, dass dies die offensichtliche Antwort ist, aber Sie übersehen wahrscheinlich eine relativ einfache Anforderung.

JHaps
quelle
Untersuchen Sie die Unterschiede zwischen Framework-Versionen in Bezug auf die Referenz. Die Verwendung einer neueren Framework-Version sollte häufig keinen Unterschied machen.
JHaps
0

Ich hatte diesen Fehler beim Schreiben eines Windows-Dienstes. Ich habe Visual Studio als Administrator ausgeführt, damit meine Post-Build-Befehle meinen Dienst automatisch installieren. Ich bemerkte, dass ich, wenn ich alles schloss und VS normal ausführte (nicht als Administrator), die Referenzen ohne Fehler hinzufügen konnte.

Hoffe, diese Lösung funktioniert für Sie.

Fütemire
quelle
0

Normalerweise sollten Sie in Visual Studio 2015 das DLL-Projekt als C ++ -> CLR-Projekt aus den Vorlagen von Visual Studio erstellen. Sie können es jedoch nachträglich technisch aktivieren:

Die kritische Eigenschaft wird Common Language Runtime Supportin der Konfiguration Ihres Projekts als festgelegt bezeichnet. Es ist unter gefunden Configuration Properties > General > Common Language Runtime Support.

Dabei wird VS die Option 'Target .NET Framework' wahrscheinlich nicht aktualisieren (wie es sollte). Sie können dies manuell hinzufügen, indem Sie Ihr Projekt entladen, die Datei your_project.xxproj bearbeiten und das Target .NET framework VersionXML-Tag hinzufügen / aktualisieren .

Als Beispiel schlage ich vor, eine neue Lösung als C ++ - CLR-Projekt zu erstellen und das XML dort zu untersuchen, vielleicht sogar zu unterscheiden, um sicherzustellen, dass es nichts sehr Wichtiges gibt, das ungewöhnlich ist.

Aaron Hull
quelle
0

Meine Antwort ist etwas spät, aber stellen Sie als schnellen Test sicher, dass Sie die neueste Version der Bibliotheken verwenden.

In meinem Fall verschwand das Problem nach dem Aktualisieren einer Nuget-Bibliothek, die auf eine andere Bibliothek verwies, die das Problem verursachte.

Martin Staufcik
quelle
0

Sie können die DLL-Datei manuell hinzufügen. Zum Beispiel, wenn Sie eine DLL-Datei in Ihre WPF-Anwendung einfügen möchten und diese in Ihrem Projekt nicht referenzieren können

(Fehlermeldung: Ein Verweis auf die ".... dll" konnte nicht hinzugefügt werden. Bitte stellen Sie sicher, dass auf die Datei zugegriffen werden kann und dass es sich um eine gültige Assembly- oder COM-Komponente handelt.)

Kopieren Sie dann diese DLL-Datei und fügen Sie sie in das Installationsprojekt ein (im Anwendungsordner).

ARUN JOHN
quelle
0
  1. Starten Sie cmd.exe und geben Sie Folgendes ein:
  2. Regsvr32% dllpath%
  3. "% dllpath%" ersetzt Ihren DLL-Pfad
Charles Chen
quelle