2011-01-17 15 views
12

Właśnie zaczynam używać ZeroMQ i eksperymentuję z niektórymi próbkami. Używam wiązań języka C# i napotkam problem z uzyskaniem wyjątku DllNotFound.ZeroMQ DllNotFoundException przy użyciu powiązań .Net

Mogę ładować i uruchamiać próbki na moim komputerze programistycznym po skopiowaniu biblioteki libzmq.dll do systemu Windows/System32, ale kiedy przenosę rzeczy na inne serwery, pojawia się błąd pomimo skopiowania pliku libzmq.dll do obu folderów są uruchomione zi do systemu Windows/System32.

Umieściłem clzmq.dll w folderze, w którym znajduje się przykładowa aplikacja, a także libzmq.dll. Również umieściłem libzmq w c:/Windows/System32. Używam dodatku Service Pack 2 dla systemu Windows Server 2003. Kiedy sprawdzam zmienne środowiskowe maszyny, WINDOWS/System32 jest w zmiennej PATH. Zrobiłem również, aby zbudować libzmq dll za pomocą Release, a nie debugowania.

Jest możliwe, że nie rozumiem, w jaki sposób należy zastosować wiązanie ZeroMQ .Net. Dodałem clzmq.dll (The. Binding) do mojego projektu jako odniesienia i założyłem, że clzmq.dll automatycznie odwoływał się do libzmq w zmiennej PATH systemu Windows WINDOWS/System32.

Czy ktoś wie, czy się mylę w tej sprawie. Dokumentacja powiązania C# (http://www.zeromq.org/bindings:clr) stwierdza, że ​​"plik biblioteki ZeroMQ będzie musiał być udostępniony, aby powiązanie zadziałało", ale nie udało mi się udostępnić tego pliku pomimo jego skopiowania do zmiennej PATH.

Czy ktoś napotkał wyjątek biblioteki DLL nie znaleziony podczas korzystania z powiązań sieci .NET w wersji ZeroMQ?

Dzięki za pomoc,

+6

Pomyślałem, że zamieściłbym rozwiązanie tego problemu, jeśli ktoś inny się na to zdecyduje. Plik libzmq.dll ma zależności od pliku MSVCP100.dll, który był nieobecny na komputerze, na którym próbowałem uruchomić aplikację. Sposób, w jaki to rozgrywałam, polegał na pobieraniu i uruchomianiu zależności na stronie www.dependencywalker.com i po prostu uruchomieniu go. To natychmiast pokazało brakującą bibliotekę DLL. Następnie zainstalowałem pakiet redystrybucyjny Microsoft Visual C++ 2010, aby naprawić brakującą bibliotekę DLL, która była wymagana przez libzmq. Mam nadzieję, że to zaoszczędzi innym czasu. – Learning1

+0

Powinieneś opublikować to jako odpowiedź i wybrać jako rozwiązanie swojego pytania. W ten sposób ludzie będą mogli łatwiej go znaleźć. – dandan78

+0

Aby to rzucić, mimo że korzystam z wersji x 64 systemu Windows, potrzebowałem zainstalować wersję redystrybucyjną x86. Ma to sens, ale zmarnowałem godzinę na dojście do tego wniosku. –

Odpowiedz

2

nadal mam ten sam problem po Sprawdziłem mój system ma Microsoft Visual C++ 2010 Redistributable. Mój system operacyjny to Windows 7 64bit. Mam bibliotekę ZeroMQ od NuGet w Visual Studio 2010.

PS, znalazłem rozwiązanie, aby rozwiązać mój błąd. Podczas pobierania ZeroMQ z NuGet w VS, pojawia się ostrzeżenie, które najpierw zignorowałem. Mówi się, aby ręcznie skopiować libzmq.dll do wyjściowego katalogu projektu poza odniesieniem do clrzmq2. Po ręcznym skopiowaniu biblioteki libzmq.dll do katalogu wyjściowego, działa ona teraz. Przy okazji, próbowałem skopiować libzmq.dll do C: \ Windows \ System32 jak wspomniano powyżej, to też nie działało.

Mam nadzieję, że to pomaga.

8

natknąłem dokładnie ten błąd w systemie Windows Server 2008. Jak tylko mój kod próbowali stworzyć clrzmq (2.2.3) obiekt, Windows próbował załadować biblioteki DLL i powiodło się z powodu błędu:

Unable to load DLL 'libzmq': The specified module could not be found. 

DLL jest zdecydowanie najbardziej obecny. Próbowałem różnych rozwiązań z uprawnieniami, które nie rozwiązały problemu. Pobranie & instalowania redystrybucyjnego VS2010 C++ rozwiązało mój problem.

+0

Dziękuję, chciałbym zagłosować 10 razy, gdybym mógł :) –

2

Jeśli używasz pakietu Nuget ZeroMQ i pojawia się błąd:

Unable to load DLL 'libzmq' 

Idź do Solution Explorer i zobaczyć, że pakiet Nuget dodała amd64 oraz i386 foldery dla Ciebie. Rozwiń te foldery, zaznacz każdy plik w nich, a następnie przejdź do okna Właściwości i wybierz "Kopiuj, jeśli jest nowsza" dla "Kopiuj do katalogu wyjściowego".

To wydaje się być najbardziej eleganckim rozwiązaniem problemu i działa automatycznie w obu architekturach. System Windows wyszuka bieżącą ścieżkę + i386/amd64 na podstawie architektury.

+0

To rozwiązało mój problem. I jest również dość eleganckim rozwiązaniem – Nitay

Powiązane problemy