使用Windows 8/WinRT的Metro应用程序中的PInvoke 我在Silverlight 5浏览器中有一个简单的调频收音机调谐器应用程序,它使用P援克从我的USB FM接收器调用来自原生C++的DLL代码。该应用程序在Windows8和Silverlight5中运行良好

使用Windows 8/WinRT的Metro应用程序中的PInvoke 我在Silverlight 5浏览器中有一个简单的调频收音机调谐器应用程序,它使用P援克从我的USB FM接收器调用来自原生C++的DLL代码。该应用程序在Windows8和Silverlight5中运行良好,silverlight,pinvoke,windows-8,windows-runtime,microsoft-metro,Silverlight,Pinvoke,Windows 8,Windows Runtime,Microsoft Metro,现在我正在尝试使用WinRT将其移植到Metro应用程序 从Silverlight到XAMLUI的迁移非常简单,并且工作良好。通过命名空间System.Runtime.InteropServices和DLLImport属性,可以很好地检测到PInvoke签名和属性 问题是,当我运行应用程序并从PInvoked本机DLL调用任何方法时(该DLL在我的SL5应用程序中使用,即使在Windows8上也可以正常工作),我有以下例外: System.DllNotFoundException was unh

现在我正在尝试使用WinRT将其移植到Metro应用程序

从Silverlight到XAMLUI的迁移非常简单,并且工作良好。通过命名空间System.Runtime.InteropServices和DLLImport属性,可以很好地检测到PInvoke签名和属性

问题是,当我运行应用程序并从PInvoked本机DLL调用任何方法时(该DLL在我的SL5应用程序中使用,即使在Windows8上也可以正常工作),我有以下例外:

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: 
那么,我的问题是,这条细尾蛇有什么问题?由于它在Windows8和SL5应用程序上运行良好,我不认为WinRT/Metro应用程序有任何问题

根据作者对Chris Pietschmann回答的回复:

.NET Metro应用程序肯定支持p/Invoke和COM互操作。Win32 API也被支持,并且可以通过上述技术调用,尽管它仅限于那些可用于Metro应用程序的功能(即如果C++ Metro应用程序不能调用它,也不能.NET应用程序)。 正如所指出的,cartftffm.dll可能包含WinRT的Win32 API表面不受支持的部分:

仅支持Win32和COM API的一个子集:


除非它是系统DLL或可通过系统路径定位,否则需要确保将DLL复制到与Metro应用程序部署在同一文件夹中


我通过将本机DLL添加到Metro应用程序项目中解决了这个问题,确保构建操作设置为“内容”,并且复制到输出目录设置为“始终复制”或“较新时复制”。

听起来好像包清单中缺少DLL。当前的文档太模糊,无法提供一个好的链接。看看这个问题:听起来类似,但仍然没有成功…Metro应用程序不允许调用任何Win32函数。可能DLL在加载(DllMain)时使用了无效调用,这会导致加载失败。记住它还不是Beta版…@gutenbergriebeiro我想你现在已经找到了解决这个问题的方法,但是如果没有,请看下面我的答案。