8

Ho una semplice app Radio Tuner FM in Silverlight 5 Out-of-browser che chiama il codice da una DLL nativa C++ dal mio ricevitore FM USB utilizzando PInvoke. Questa applicazione funziona molto bene in Windows 8 con Silverlight5.PInvoke in Metro App con Windows 8/WinRT

Ora sto provando a portarlo su una Metro App utilizzando WinRT.

La migrazione da Silverlight a XAML UI è piuttosto semplice e ha funzionato bene. Le firme e gli attributi di PInvoke sono stati rilevati correttamente con lo spazio dei nomi System.Runtime.InteropServices e l'attributo DLLImport.

Il problema è che quando sono in esecuzione l'applicazione e chiamare qualsiasi metodo dal DLL nativa PInvoked che utilizzate per lavorare nella mia app SL5 (che funziona bene anche su Windows8), ho questa eccezione:

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: 

Quindi, la mia domanda è, qual è il problema su questo PInvoke? Dal momento che funziona bene su Windows8 con un'app SL5, non vedo alcun motivo per avere problemi con le app WinRT/Metro.

+1

Suona come la DLL non è presente il manifesto del pacchetto. I documenti attuali sono troppo oscuri per dare un buon collegamento. –

+0

Date un'occhiata a questa domanda: http://stackoverflow.com/questions/7807361/how-to-p-invoke-to-a-native-dll-from-metro –

+0

suono simile, ma ancora senza successo ... –

risposta

5

Come per Pavel Minaev s' la risposta alla risposta di Chris Pietschmann:

P/Invoke e COM Interop sono sicuramente supportate per le applicazioni Metro NET. Anche l'API Win32 è supportata e può essere richiamata tramite le tecnologie sopra indicate, sebbene sia limitata a quelle funzioni disponibili per le app Metro (ad esempio se un'app di C++ Metro non può chiamarla, nemmeno un'app .NET).

Come Morten Frederiksen punti fuori, è tuttavia probabile che CarTFTFM.dll contiene una parte non supportata della superficie API Win32 per WinRT:

solo un sottoinsieme di Win32 e COM API è supportato: msdn.microsoft.com/en-us/library/windows/apps/br205757

1

a meno che non si tratta di una DLL di sistema o comunque individuabili attraverso il percorso di sistema, è necessario fare in modo che la DLL viene copiato nella stessa cartella dell'applicazione della metropolitana è distribuito in.

ho risolto il problema aggiungendo la DLL nativa al mio progetto di applicazione della metropolitana, assicurando che Corporatura azione è impostato su contenuti e che Copia nella directory di output è impostato su Copia sempre o Copia se più recente.