2011-01-17 14 views
12

Estoy empezando a usar ZeroMQ y estoy experimentando con algunas de las muestras. Estoy usando los enlaces de lenguaje C# y me he encontrado con un problema al obtener una excepción DllNotFound.ZeroMQ DllNotFoundException usando .Net Bindings

Puedo cargar y ejecutar muestras en Mi máquina de desarrollo después de haber copiado libzmq.dll en Windows/System32, pero cuando muevo cosas a otros servidores, obtengo el error a pesar de haber copiado libzmq.dll en ambas carpetas. se ejecutan desde y hacia Windows/System32.

He puesto clzmq.dll en la carpeta donde está la aplicación de ejemplo y también libzmq.dll. También puse libzmq en c:/Windows/System32. Estoy ejecutando Windows Server 2003 Service Pack 2. Cuando verifico las variables de entorno de la máquina, WINDOWS/System32 está en la variable PATH. También me aseguré de construir el libzmq dll usando Release, no depuración.

Es posible que no entienda cómo debe usarse ZeroMQ .Net Binding. He agregado clzmq.dll (The .Net Binding) a mi proyecto como referencia y supuse que clzmq.dll haría automáticamente referencia a libzmq en la variable de Windows PATH WINDOWS/System32.

¿Alguien sabe si me equivoco en esto. La documentación de C# Binding (http://www.zeromq.org/bindings:clr) establece que "el archivo de la biblioteca ZeroMQ deberá estar disponible para que funcione el enlace", pero parece que no lo he hecho disponible a pesar de haberlo copiado en la variable PATH.

¿Alguien ha experimentado la excepción DLL no encontrada al usar los Enlaces de ZeroMQ .Net?

Gracias por la ayuda,

+6

Pensé que publicaría la solución si alguien más se topa con esto. Libzmq.dll tiene dependencias en MSVCP100.dll que estaban ausentes de la máquina en la que intentaba ejecutar la aplicación. La forma en que lo descubrí fue descargando y ejecutando el caminador de dependencias desde www.dependencywalker.com y simplemente ejecutándolo. De inmediato mostró la DLL faltante. Luego instalé el paquete redistribuible de Microsoft Visual C++ 2010 para reparar la DLL de subprocesamiento faltante que necesitaba libzmq. Espero que esto les ahorre a los demás algo de tiempo. – Learning1

+0

Debe publicar esto como una respuesta y seleccionarlo como la solución a su pregunta. De esa forma, la gente podrá encontrarlo más fácilmente. – dandan78

+0

Solo para lanzar esto, aunque estoy en una versión x64 de Windows, necesitaba instalar la versión x86 de la redistribuible. Tiene sentido ahora, pero desperdicié una hora en llegar a esa conclusión. –

Respuesta

2

todavía tengo el mismo problema después de comprobar mi sistema tiene Microsoft Visual C++ 2010 redistribuible. Mi sistema operativo es Windows 7 de 64 bits. Obtuve la biblioteca ZeroMQ de NuGet en Visual Studio 2010.

PD, encontré la solución para resolver mi error. Al descargar ZeroMQ de NuGet en VS, en realidad hay una advertencia que ignoré al principio. Dice copiar manualmente libzmq.dll al directorio de salida del proyecto además de la referencia de clrzmq2. Después de copiar manualmente libzmq.dll al directorio de salida, está funcionando ahora. Por cierto, traté de copiar libzmq.dll a C: \ Windows \ System32 como se menciona anteriormente, no funcionó demasiado.

Espero que ayude.

8

me encontré con este error exacto en Windows Server 2008. Tan pronto como mi código intentó crear un clrzmq (2.2.3) objeto, Windows ha intentado cargar el archivo DLL y no con el error:

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

La DLL está definitivamente presente. Intenté una variedad de soluciones con permisos, todas las cuales no pudieron resolver el problema. Descargando & instalando el VS2010 C++ redistribuible solucionó mi problema.

+0

Gracias, votaría 10 veces si pudiera :) –

2

Si está utilizando el paquete NuGet ZeroMQ y recibirá el siguiente error:

Unable to load DLL 'libzmq' 

Ir al Explorador de soluciones y ver que el paquete NuGet ha añadido amd64 e i386 carpetas para usted. Expanda estas carpetas, seleccione cada archivo dentro de ellas, luego vaya a la ventana Propiedades y seleccione "Copiar si es más reciente" para "Copiar al directorio de salida".

Esta parece ser la solución más elegante al problema y funciona para ambas arquitecturas automáticamente. Windows buscará la ruta actual + i386/amd64 en función de la arquitectura.

+0

Eso resolvió mi problema. Y también es una solución bastante elegante – Nitay