2011-10-18 15 views
6

Tengo una biblioteca que consta de dos partes: un ensamblado .net que P/Invokes a un dll de terceros nativo. En el modo de escritorio esto funciona bien: sin embargo, al hacer referencia al ensamblado desde una aplicación de estilo Metro y ejecutarlo, arroja un System.DllNotFoundException en el P/Invoke quejándose de que "No se puede cargar la 'biblioteca' DLL: no se pudo encontrar el módulo especificado."Cómo P/Invocar a un dll nativo de Metro?

El dll nativo no hace nada especial, pero solo crea conexiones TCP/IP salientes a un servidor. El sistema no puede saber esto, pero el dll nativo podría hacer cualquier cosa. Es por eso que sospecho que podría no ser posible hacer esto.

Algunas órdenes de búsqueda dll se mencionan en msdn con respecto a las aplicaciones de estilo Metro, dando a entender que es posible cargar dlls nativos?

También encontré este link on msdn hablar de "bibliotecas" de carga y menciona la PackageDependency en el archivo de manifiesto, pero a mí aún no está claro cómo agregar un archivo DLL nativo al paquete de una manera que es posible P/Invoke se.

+0

¿Puedes intentar comentar las cosas de TCP/IP en la DLL y volver a probar? Eso distinguirá no encontrar la DLL de no encontrar sus dependencias. Además, ¿marcó las capacidades que desea usar para la conexión de Internet saliente? –

+0

No construí el dll. No es parte de la solución. Entonces no puedo cambiar la forma en que se construyó el dll. ¡Buen punto de que podría ser una dependencia secundaria que causa el error! Lo comprobaré lo antes posible. – vidstige

+1

@vidstige Probablemente ya hayas resuelto este problema, pero por lo demás echa un vistazo a [mi respuesta] (http://stackoverflow.com/a/12122750/650012) a una pregunta relacionada. –

Respuesta

0

Agréguela a su proyecto (haga clic con el botón secundario en proyecto, Agregar, elemento existente). Verifique que en las propiedades de ese elemento, el Contenido esté configurado en True (es falso de forma predeterminada). Build.

+0

Gracias por su respuesta. Esto funciona en un entorno normal de C#, pero lo probé y no pude lograr que funcionara en el proyecto Metro. – vidstige

+1

Describir "no funciona" - ¿compilar error? pantalla verde misterio en el lanzamiento? Exeption lanzado mientras se ejecuta? –

+1

¡He actualizado la pregunta con un mensaje de error específico! La excepción se produce cuando se llama al método con el atributo P/Invoke. – vidstige

0

Esto es probablemente por diseño. Su problema puede ser causado por un error con el código de error 126 que se devuelve desde LoadLibrary. Si su aplicación se ejecuta en modo de escritorio, debe apuntar al modo de escritorio para su aplicación. También puede usar una versión anterior de Windows.

Cuestiones relacionadas