8

Tengo una sencilla aplicación de sintonizador de radio FM en Silverlight 5 fuera del navegador que llama al código de una DLL C++ nativa desde mi receptor USB FM utilizando PInvoke. Esta aplicación funciona muy bien en Windows 8 con Silverlight5.PInvoke en aplicaciones de Metro con Windows 8/WinRT

Ahora intento portarlo a una aplicación de Metro usando WinRT.

La migración de Silverlight a XAML UI es bastante fácil y funcionó bien. Las firmas y los atributos de PInvoke se detectaron correctamente con el espacio de nombres System.Runtime.InteropServices y el atributo DLLImport.

El problema es que cuando estoy corriendo la aplicación y llamar a cualquier método de la DLL nativa PInvoked que solía trabajar en mi aplicación SL5 (que funciona bien incluso en Windows8), tengo esta excepción:

System.DllNotFoundException was unhandled by user code 
    Message=Unable to load DLL 'CarTFTFM.dll': The specified module could not be found. (Exception from HRESULT: 0x8007007E) 
    Source=metroradio 
    TypeName="" 
    StackTrace: 
     at MetroRadio.FMRadio.HWInit2(Int32 port, Int32 initVolume) 
     at MetroRadio.MediaService.InitializeRadio() in c:\Users\Gutemberg\Documents\Visual Studio 11\Projects\MetroRadio\MetroRadio\MediaService.cs:line 160 
     at MetroRadio.MainPage.radio_Click(Object sender, RoutedEventArgs e) in c:\Users\Gutemberg\Documents\Visual Studio 11\Projects\MetroRadio\MetroRadio\MainPage.xaml.cs:line 43 
    InnerException: 

Entonces, mi pregunta es, ¿cuál es el problema en este PInvoke? Dado que funciona bien en Windows8 con una aplicación SL5, no veo ningún motivo para tener problemas con WinRT/Metro Apps.

+1

Parece que la DLL no se encuentra en el manifiesto del paquete. Los documentos actuales son demasiado oscuros para dar un buen enlace. –

+0

Eche un vistazo a esta pregunta: http://stackoverflow.com/questions/7807361/how-to-p-invoke-to-a-native-dll-from-metro –

+0

Sonido similar pero aún sin éxito ... –

Respuesta

5

Según Pavel Minaev 's respuesta a la respuesta de Chris Pietschmann:

P/Invoke y la interoperabilidad COM son ciertamente compatibles para aplicaciones .NET Metro. Win32 API también es compatible y se puede invocar a través de las tecnologías anteriores, aunque está limitado a aquellas funciones que están disponibles para las aplicaciones Metro (es decir, si una aplicación C++ Metro no puede llamarlo, tampoco una aplicación .NET).

Como Morten Frederiksen señala, Sin embargo, es probable que CarTFTFM.dll contiene una parte no soportada de la superficie API Win32 para WinRT:

Sólo un subconjunto de Win32 y API COM está soportado: msdn.microsoft.com/en-us/library/windows/apps/br205757

1

a no ser que se trata de un archivo DLL del sistema o de otro modo localizable a través de la ruta del sistema, es necesario asegurarse de que el archivo DLL se copia en la misma carpeta que su aplicación se despliega en metro.

He resuelto el problema mediante la adición de la DLL nativa de mi proyecto de aplicación de metro, asegurando que Acción de generación se establece en contenido y que Copiar al Directorio de salida se establece en Copiar siempre o Copiar si es más nuevo.

Cuestiones relacionadas