8

我在Silverlight 5中有一個簡單的FM收音機調諧器應用程序,它使用PInvoke從我的USB FM接收器調用本機C++ DLL中的代碼。此應用程序在Windows 8和Silverlight5中運行得非常好。使用Windows 8/WinRT在Metro應用程序中啓用

現在我試圖使用WinRT將它移植到Metro應用程序。

從Silverlight到XAML UI的遷移非常簡單,並且運行良好。使用命名空間System.Runtime.InteropServices和DLLImport屬性可以很好地檢測到PInvoke簽名和屬性。

的問題是,當我運行應用程序並調用從使用在我的SL5的應用程序(甚至在Windows8中正常工作)工作PInvoked本地DLL的任何方法,我有這樣的例外:

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: 

所以,我的問題是,這個PInvoke有什麼問題?由於它適用於Windows8和SL5應用程序,因此我沒有看到任何有關WinRT/Metro應用程序出現問題的原因。

+1

包聲明中缺少聲音,如DLL。當前的文檔太模糊,無法提供良好的鏈接。 – 2012-01-16 15:09:45

+0

看看這個問題:http://stackoverflow.com/questions/7807361/how-to-p-invoke-to-a-native-dll-from-metro – 2012-01-16 15:26:30

+0

聲音相似,但仍然沒有成功... – 2012-01-16 15:50:54

回答

5

Pavel Minaev的答覆克里斯Pietschmann的回答是:

的P/Invoke和COM互操作是肯定支持.NET應用程序新城。 Win32 API也受支持,可以通過上述技術調用,儘管它僅限於Metro應用程序可用的那些函數(即,如果C++ Metro應用程序不能調用它,.NET應用程序也不可以)。

由於Morten Frederiksen指出的,然而可能CarTFTFM.dll包含在Win32 API表面的WinRT的不支持的部分:

只有Win32的一個子集和COM API支持:msdn.microsoft.com/en-us/library/windows/apps/br205757

1

除非它是一個系統DLL或通過系統路徑,否則可定位的,你需要確保你的DLL複製到同一文件夾作爲你的Metro應用程序部署英寸

我加入了原生DLL到我的地鐵應用程序項目解決了這個問題,確保生成操作設置爲內容複製到輸出目錄設置爲一直拷貝複製如果較新

相關問題