结合C#和C++项目适用于x86和x64,但不适用于ARM。

6
我在我的解决方案中有两个项目。一个是C#通用应用程序,另一个是C++项目(从这里获得),并且重新定向到Windows 8.1(当我导入项目时Visual Studio 15执行了此操作)。我已经从我的C#项目引用了C++项目,并将Copy Local设置为true。
代码在所有三个平台(x86、x64和ARM)上都可以构建。但是,在部署到ARM设备时,当我尝试访问C++代码时会抛出异常。在x86和x64版本中,这不是问题,代码可以正常工作。异常是System.IO.FileNotFoundException这里是详细的pastebin异常信息
我的理解是,生成的.dll文件由于某种原因未被复制到设备上。我已经查看了配置设置,就我所知,一切都设置正确(如下图所示)。另一种可能性是C++项目对另一个类有内部依赖关系,我需要在某个地方识别并引用它。堆栈跟踪中的一行(包含在上面的pastebin链接中)表明它发生在System.StubHelpers.StubHelpers.GetWinRTFactoryObject(IntPtr pCPCMD)这一行。
C++代码使用Media Foundation WinRT组件,在ARM设备上应该可以正常工作。
似乎其他SO上的问题(例如here)也研究过这个问题,但只针对特定平台,如x86。
目前为什么在x86和x64上能够正常工作,而在ARM上不能?
截图:

enter image description here

enter image description here


@HansPassant 我已经苦苦挣扎了一段时间。我显然熟悉调试器,但是我应该如何具体检查 MFStartup() 失败?你能给我一些建议尝试的事情吗?我不确定。 - Gordonium
1
C++ DLL需要与C运行时库链接。 ARM设备上是否安装了这些DLL的正确版本?多年来我由于这个原因经常遇到此错误。 - 1201ProgramAlarm
@1201ProgramAlarm 具体是哪些DLL?C++ DLL 是我自己的,所以我猜你是指运行时?两台设备都拥有最新版本的 Windows 10 预览版。我该如何检查手机上的运行时 DLL 版本? - Gordonium
是的,我指的是运行时。我不知道如何检查手机上有什么。是否有类似于Dependency Walker(Depends.exe)的东西可以在手机上运行? - 1201ProgramAlarm
也许这篇文章能帮到你:如何解决Visual Studio/MSBuild中与mscorlib相关的问题 - Simon Kraemer
1个回答

3

并重新定向到Windows 8.1。

这就是你的问题所在。如果你的目标是Windows 10设备,你需要创建一个新的Windows Runtime组件(通用Windows):

Universal Windows (10) C++ Windows Runtime Component

我的猜测是Windows 8.1 Winmd与您选择的设备不兼容。
我已经下载了VideoRecorder工具,并重现了您的问题。然后,如果我创建一个新的Winmd通用Windows,将C++文件添加到其中,在带有Windows 10 IoT的Raspberry Pi 2上运行时,它可以正常运行。
编辑:如果您的目标是Windows 8.1设备而不是Windows 10设备,则需要使用通用Windows 8.1项目。

Universal Windows 8.1 C++ Windows Runtime Component

我已经制作了一个样例,并在 Nokia Lumia 925 上成功部署,没有出现任何问题。


这看起来不错。我已经实现了它,但不幸的是,似乎我有一个新问题(与此线程无关),涉及部署期间的错误消息。我在这里发布了一个问题。一旦我解决了这个问题,我会告诉你你的解决方案是否有效,并在有效时奖励悬赏。 - Gordonium
你的目标设备是什么?我在一台安装了Windows 10 IoT的Raspberry Pi 2上部署了示例。 - Julien Lebot
有趣。我正在瞄准一款诺基亚Lumia 820手机。 - Gordonium
好的,我以为你正在使用新的Windows 10通用应用程序,但如果你的目标是Windows 8.1设备,你需要另一种项目类型。在我测试了Lumia 925之后,我已经更新了我的答案。如果你仍然有困难,我可以提供我使用的示例解决方案。 - Julien Lebot
我在Lumia 820上安装了Windows 10。这仍然会引起问题吗? - Gordonium
我也在Lumia 925上安装了Windows 10 :) 我无法在其上部署Windows 10应用程序,因为我没有最新版本,我正在下载更新,然后再次测试。 - Julien Lebot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接