8

Mam prostą aplikację Tuner radiowy FM w Silverlight 5 Poza przeglądarką, która wywołuje kod z Natywnej biblioteki DLL C++ z mojego odbiornika USB FM za pomocą PInvoke. Ta aplikacja działa bardzo dobrze w Windows 8 z Silverlight5.PInvoke w aplikacjach Metro z Windows 8/WinRT

Teraz próbuję przenieść go do aplikacji Metro za pomocą WinRT.

Migracja z Silverlight do XAML UI jest łatwa i działa dobrze. Sygnatury i atrybuty PInvoke zostały wykryte w porządku w przestrzeni nazw System.Runtime.InteropServices i atrybut DLLImport.

Problem polega na tym, że kiedy biegnę aplikację i wywołać dowolną metodę z rodzimym DLL PInvoked że wykorzystywane do pracy w mojej aplikacji SL5 (który działa dobrze nawet na Windows8), mam ten wyjątek:

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: 

Moje pytanie brzmi, jaki jest problem w tym PInvoke? Ponieważ działa dobrze na Windows8 z aplikacją SL5, nie widzę żadnych powodów, aby mieć problemy z aplikacjami WinRT/Metro.

+1

Wygląda na to, że w manifeście pakietu brakuje biblioteki DLL. Obecne dokumenty są zbyt niejasne, aby dać dobry link. –

+0

Spójrz na to pytanie: http://stackoverflow.com/questions/7807361/how-to-p-invoke-to-a-ative-dll-from-metro –

+0

Brzmi podobnie, ale wciąż nie ma sukcesu ... –

Odpowiedz

5

Zgodnie Pavel Minaev „s odpowiedzi na odpowiedź Chris Pietschmann za:

P/Invoke i COM Interop są z pewnością dla obsługiwanych aplikacji .NET metra. Interfejs API Win32 jest również obsługiwany i można go wywoływać za pomocą powyższych technologii, ale jest on ograniczony do funkcji dostępnych w aplikacjach Metro (np. Jeśli aplikacja C++ Metro nie może tego wywołać, nie można też aplikacji .NET).

Morten Frederiksen Jak zaznacza, jest jednak prawdopodobne, że CarTFTFM.dll zawiera nieobsługiwany część powierzchni Win32 API dla WinRT:

tylko podzbiór Win32 oraz COM API jest obsługiwany: msdn.microsoft.com/en-us/library/windows/apps/br205757

1

o ile nie jest to inaczej DLL systemu lub zlokalizować dzięki ścieżce systemowej, należy upewnić się, że Twój DLL jest kopiowany do tego samego folderu jako aplikacja Metro jest wdrożony w.

I rozwiązać problem dodając rodzimych DLL do mojego projektu aplikacji metra, zapewniając, że Budowa Action jest ustawiony na Treści i że Kopiuj do Output Directory, jest ustawiony na Copy Zawsze lub Copy jeśli Nowsze.

Powiązane problemy