Nie można dodać odwołania do biblioteki dll

95

Kiedy dodam plik .dll jako odwołanie w aplikacji C #, pojawia się błąd:

Nie można dodać odniesienia do „.... dll”. Upewnij się, że plik jest dostępny i że jest to poprawny zestaw lub składnik COM.

ILDissassembler mówi, że nie ma prawidłowego nagłówka CLR, więc próbuję go zarejestrować za pomocą regsvr32, co daje mi kolejny błąd:

Moduł „” został załadowany, ale wywołanie DLLRegisterServer nie powiodło się. Kod błędu „0x80004005”

Używam ostatecznej wersji VS2010 na 64-bitowym komputerze z systemem Windows 7. Jaki może być problem?

Dzięki za wszelkie wskazówki / odpowiedzi

user20358
źródło

Odpowiedzi:

53

Pracowały dla mnie:

Krótka odpowiedź

Uruchom następujące polecenie za pomocą wiersza poleceń (cmd):

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

Zostanie utworzona prawidłowa biblioteka dll.

Dłuższa odpowiedź

  • Otwórz cmd

  • Znajdź TlbImp.exe. Prawdopodobnie znajduje się w C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v7.0A \ Bin. Jeśli nie możesz go znaleźć, przejdź do folderu głównego (C: \ lub D :) i uruchom:

    dir tlbimp.exe /s              //this will locate the file.
  • Uruchom tlbimp.exe i umieść za nim swoją bibliotekę dll. Przykład: jeśli Twój plik dll to cvextern.dll. Możesz biegać:

    TlbImp.exe cvextern.dll
  • Nowa biblioteka dll została utworzona w tym samym folderze co tlbimp.exe. Możesz użyć tego jako odniesienia w swoim projekcie.
Memet Olsen
źródło
5
Innym sposobem uzyskania dostępu do TlbImp.exe jest otwarcie wiersza polecenia programu Visual Studio.
Scott,
75
@Memet Afer próbuje tego Mam, TlbImp : error TI0000 : The input file 'c:\Program Files\Microsoft SDKs\Windows\ v7.0A\bin\MyLibrary.dll' is not a valid type library.jakieś sugestie?
Dineshkumar
1
Plik wejściowy C: \ Windows \ SYSTEM32 \ SqlServerSpatial.dll 'nie jest prawidłową biblioteką typów
Christine
7
Mając ten sam błąd, co stwierdził Dineshkumar Ponnusamy. Proszę, pomóż mi
wyścig śmierci
1
Kiedy musisz używać TLBMP? Zwykle w VS2015, jeśli po prostu dodasz odwołanie do biblioteki DLL COM z okna referencji, zajmie się tym wszystkim za Ciebie.
UuDdLrLrSs
20

Bibliotekę DLL (lub EXE) można dodać do projektu tylko wtedy, gdy jest to zestaw .NET. Jeśli tak nie jest, zostanie wyświetlony ten komunikat o błędzie.

regsvr32 przyjmuje również pewne założenia dotyczące struktury i funkcji eksportowanej w bibliotece DLL. Minęło trochę czasu, odkąd go używałem, ale ma to związek z rejestracją serwerów COM, więc pewne punkty wejścia muszą być dostępne. Jeśli regsvr32 nie powiedzie się, biblioteka DLL nie udostępnia tych punktów wejścia, a biblioteka DLL nie zawiera składnika COM.

Jedyną szansą na użycie biblioteki DLL jest zaimportowanie jej jak każdego innego pliku binarnego innego niż .NET, np. Podczas korzystania z niektórych interfejsów API Win32. Istnieje stary artykuł z magazynu MSDN, który może być pomocny. Zobacz następującą aktualizację, aby dowiedzieć się, skąd wziąć artykuł.

Aktualizacja z 12 marca 2018 r .: Odsyłacz do magazynu MSDN nie działa już tak jak w sierpniu 2010 r. Artykuł Jasona Clarka nosi tytuł „Kolumna .NET: wywoływanie bibliotek DLL Win32 w języku C # za pomocą funkcji P / Invoke”. Został opublikowany w lipcowym numerze MSDN Magazine. W „Wayback Maszyna” ma artykuł tutaj w tej chwili (formatowanie jest ograniczona). Cały numer magazynu MSDN z lipca 2010 r. Jest dostępny tutaj (tylko format HCM, instrukcje korzystania z plików HCM tutaj ).

Manfred
źródło
Czy istnieje sposób, aby upewnić się, że kompilator umieści plik .dll w folderze wyjściowym, nawet jeśli nie jest to odniesienie?
Kyle Delaney
1
@KyleDelaney Nie sądzę, żeby kompilator mógł to zrobić. Rozważę umieszczenie polecenia copy lub xcopy w zdarzeniu przed kompilacją / po kompilacji projektu / rozwiązania. Jest to jednak instrukcja, ale generalnie odwołania nie zmieniają się zbyt często i odpowiedni zestaw testów powinien wychwycić przypadki, w których zapomniałeś zaktualizować polecenia wykonywane w zdarzeniu przed kompilacją / po kompilacji.
Manfred
Dziękuję za odpowiedź!
Kyle Delaney
Link do artykułu jest martwy.
Roald
@Roald Dziękuję. Tak, link jest rzeczywiście uszkodzony. Firma Microsoft udostępnia format HCM całego wydania MSDN Magazine pod innym adresem URL. Wayback Machine posiada również migawkę samego artykułu w formacie HTML z uproszczonym wyglądem. Zaktualizowałem odpowiedź, aby to odzwierciedlić, a także usunąłem uszkodzony link z mojej odpowiedzi. Mam nadzieję że to pomoże.
Manfred
12

Użyłem narzędzia Dependency Walker, aby sprawdzić wewnętrzne odwołania dll. Okazuje się, że potrzebował VB runtime msvbvm60.dll, a ponieważ mój programista go nie ma, nie mogłem go zarejestrować za pomocą regsvr32

Na razie wydaje się, że jest to odpowiedź na moje pierwotne pytanie.

user20358
źródło
W moim przypadku musiałem usunąć folder obj dla projektu, do którego próbowałem się odwołać, a następnie przebudowałem projekt.
Tolu
7

Upewnij się, że Twój kompilator jest ustawiony na x86, jeśli próbujesz odwołać się do biblioteki DLL x86 ...

Miałem podobne problemy ... jak wspomniano powyżej, próbując użyć OLEDB, aby uzyskać dostęp do pliku Excel z mojego kodu C # w programie Visual Studio 2012.

Ciągle otrzymywałem błędy dotyczące niedostępności biblioteki Access, ale wiedziałem, że ją załadowałem.

Podczas debugowania dotarło do mnie, że kompiluję wersję 64-bitową, ale mam załadowany pakiet Office x86. Mimo że załadowałem bibliotekę Access w wersji 32-bitowej, nigdy nie była używana przez aplikację ... i dlatego nie była dostępna.

Oto, czego używałem w C #:

"Dostawca = Microsoft.ACE.OLEDB.12.0; Źródło danych =" + strFilePath + "; Właściwości rozszerzone = 'Excel 12.0 Xml; HDR = Tak'";

... Pojawił się błąd

Jak tylko przełączyłem kompilator na x86, zadziałał

Robert Obergfoll
źródło
2

Właśnie natknąłem się na ten problem i po wszystkich wyjaśnieniach dotyczących naprawiania go za pomocą wiersza polecenia stwierdziłem, że jeśli dodasz go bezpośrednio do projektu, możesz po prostu dołączyć bibliotekę na każdej stronie, która jest potrzebna

JeffB
źródło
2

Mam ten sam problem z importowaniem pliku WinSCard.dll do mojego projektu. Radzę sobie z tym importowaniem bezpośrednio z dll w ten sposób:

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

Możesz dodać to, aby oddzielić projekt, a następnie dodać odniesienie do głównego projektu.

Sashus
źródło
1

Miałem ten problem po ponownym uruchomieniu komputera podczas tworzenia rozwiązania. Moje dwa referencje zniknęły, więc musiałem ręcznie przebudować moje dwa projekty, a następnie mogłem dodać referencje bez błędów.

Rafal Cypcer
źródło
1

Nie można dodać odwołania do natywnej biblioteki DLL. Możesz jednak uwzględnić je w rozwiązaniu (rozwiązanie kliknij prawym przyciskiem myszy, wybierz "Dodaj istniejący plik"), ale nie będą się do nich odwoływać, chyba że zadeklarujesz coś takiego

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

Może jest jakiś rodzaj opakowania biblioteki DLL, do której faktycznie się odwołujesz i która zawiera import DLL.

Czasami możesz odwołać się do otoki DLL, ale nadal nie możesz uruchomić programu, gdy monit o błąd sugeruje, aby upewnić się, że plik istnieje, a wszystkie zależności są dostępne.

Ten problem jest spowodowany tym, że zestaw, który próbujesz dodać, jest przeznaczony i skompilowany tylko dla architektury procesora x86 lub x64 .

Po prostu spróbuj zmienić platformę docelową na x86 lub x64 w Build -> Configuration Manager .

Leon Wolf
źródło
1

Musiałem zmienić architekturę na x86 z x64 w menedżerze konfiguracji i skopiować moją 32-bitową bibliotekę dll (język C - pcProxAPI.dll) do nowego folderu, który został utworzony .. To jest na szczycie kroków opisanych poniżej przez "Sashus" .

C: \ Projekty .. \ bin \ x86 \ Debug

boateng
źródło
To był również dla mnie problem.
rogue39nin
ale jeśli wartość domyślna to nie x86 ani x64? ale… Pojawiło się „Any Cpu”…?
gumuruh
codeproject.com/articles/1160645/… Każdy procesor może również działać, jeśli skopiujesz tam 32-bitową bibliotekę dll
boateng
1

Miałem ten sam problem, kiedy próbowałem dodać bibliotekę DLL, którą właśnie zakodowałem w C ++ do mojego nowego projektu C #. Okazało się, że muszę ustawić właściwości projektu C ++, z którego pochodzi moja dll:

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

Ponieważ projekt C #, w którym chciałem użyć tej biblioteki dll, został również ustawiony w ten sposób (miał ustawione te same właściwości /clr).

LoukMouk
źródło
Eksplorator rozwiązań> Właściwości> Właściwości konfiguracji
Yuresh Karunanayake
@gumuruh Jeśli masz na myśli „co to jest clr?”, to CLR to docs.microsoft.com/en-us/dotnet/standard/clr
LoukMouk
0

Miałem podobny problem. Próbowałem dodać odniesienie do biblioteki dll .net 2.0 do projektu .Net 1.1. Kiedy próbowałem dodać poprzednią wersję .dll, która była zgodna z .Net 1.1. to działało dla mnie.

user2623151
źródło
0

Dla każdego, kto szuka pomocy w tej sprawie lub ma wyjątek FileNotFoundException lub FirstChanceException, sprawdź moją odpowiedź tutaj:

Wystąpił wyjątek pierwszej szansy typu „System.IO.FileNotFoundException” w pliku mscorlib.ni.dll - Windows Phone

Ogólnie rzecz biorąc, musisz mieć absolutną pewność, że spełniasz wszystkie wymagania dotyczące tworzenia odniesienia - wiem, że to oczywista odpowiedź, ale prawdopodobnie przeoczysz stosunkowo prosty wymóg.

JHaps
źródło
Przyjrzyj się różnicom między wersjami frameworka w odniesieniu do referencji - często używanie nowszej wersji frameworka nie powinno robić różnicy.
JHaps
0

Wystąpił ten błąd podczas pisania usługi systemu Windows. Używałem programu Visual Studio jako administrator, aby moje polecenia po kompilacji automatycznie instalowały moją usługę. Zauważyłem, że kiedy zamknąłem wszystko i uruchomiłem VS normalnie (nie jako administrator), pozwolił mi dodać odniesienia dobrze, bez błędów.

Mam nadzieję, że to rozwiązanie działa dla Ciebie.

Fütemire
źródło
0

Zwykle w Visual Studio 2015 powinieneś utworzyć projekt dll jako projekt C ++ -> CLR z szablonów Visual Studio, ale możesz technicznie włączyć go po fakcie:

Właściwość krytyczna nosi nazwę Common Language Runtime Supportset w konfiguracji projektu. Znajduje się pod Configuration Properties > General > Common Language Runtime Support.

Robiąc to, VS prawdopodobnie nie zaktualizuje opcji „Docelowy .NET Framework” (tak jak powinno). Możesz to dodać ręcznie, zwalniając projekt, edytując plik your_project.xxproj i dodając / aktualizującTarget .NET framework Version znacznik XML.

Na przykład proponuję utworzenie nowego rozwiązania jako projekt C ++ CLR i zbadanie tam XML-a, być może nawet porównanie go, aby upewnić się, że nie ma nic bardzo ważnego, co jest niezwykłe.

Aaron Hull
źródło
0

Moja odpowiedź jest trochę spóźniona, ale w ramach szybkiego testu upewnij się, że korzystasz z najnowszej wersji bibliotek.

W moim przypadku po zaktualizowaniu biblioteki nuget, która odwoływała się do innej biblioteki powodującej problem, problem zniknął.

Martin Staufcik
źródło
0

Możesz dodać plik .dll ręcznie. Na przykład, jeśli chcesz dodać plik dll w aplikacji WPF i nie możesz odnieść się do niego w projekcie

(Błąd podczas wyświetlania: nie można dodać odwołania do „.... dll”. Upewnij się, że plik jest dostępny i że jest to poprawny zestaw lub komponent COM),

następnie SKOPIUJ ten plik dll i WKLEJ W PROJEKCIE INSTALATORA (w folderze aplikacji).

ARUN JOHN
źródło
0
  1. uruchom cmd.exe i wpisz:
  2. Regsvr32% dllpath%
  3. „% dllpath%” zamień na ścieżkę dll
charles chen
źródło