UWP C#app调用用C ++编写的Windows运行时组件

时间:2016-07-28 02:27:16

标签: c++ visual-studio-2015 windows-10-universal windows-10-mobile c++-cx

我正在尝试创建一个用C ++编写的 Windows运行时(WinRT)组件(c ++ - cx),可以从我的UWP C#app调用。我遵循了这个MSDN Tutorial
这一切都很好。我能够建立和在Windows-10桌面和桌面上运行上面链接中指定的代码/示例;移动 我然后尝试创建一个更简单的WinRT组件。我按照与上面教程相同的步骤进行操作。创建了Windows运行时组件项目(文件 - >新建 - >项目 - > Visual C ++ - > Windows->通用 - > Windows运行时组件(通用Windows))
现在我的班级只有一个功能, getNum 基本上会返回 uint16
这是我的类头文件

#pragma once
#include <collection.h>

namespace WRT_sample
{
    public ref class Class1 sealed
    {
        public:
              Class1();
              uint16 getNum();
    };
}

这是相应的cpp文件:

#include "Class1.h"


using namespace WRT_sample;
using namespace Platform;

Class1::Class1()
{
}

uint16 Class1::getNum()
{
     return 100;
}


我在使用VS-2015创建新WinRT项目时提供的相同类名(Class1.h&amp; Class1.cpp)。
这就是我用C#代码调用WinRT类的方法:

namespace CS_WRT_sample
{
    public sealed partial class MainPage : Page
    {
       public MainPage()
       {
            this.InitializeComponent();
            initWRT();
       }

       void initWRT()
       {
            try
            {
                var nativeObj = new Class1();
                var num = nativeObj.getNum();
                this.Result2.Text = "Num from Cpp: " + num.ToString();
                Debug.WriteLine("Num from Cpp: " + num);
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex.Message);
                this.Result3.Text = ex.Message;
            }
        }
    }
}


我能够建立和发展在桌面(x86 / x64本地计算机)上运行我的代码,但是当我尝试在Mobile(x86仿真器或ARM设备)上运行时,它失败并出现以下错误:

  

抛出异常:CS_WRT_sample.exe中的“System.IO.FileNotFoundException”   
找不到指定的模块。 (来自HRESULT的例外: 0x8007007E)**

这是我看到的堆栈跟踪:

  

System.StubHelpers.StubHelpers.GetWinRTFactoryObject(IntPtr pCPCMD)     
在WRT_sample.Class1..ctor()     
在CS_WRT_sample.MainPage.initWRT()


我的VS-2015详细信息:

  

MS Visual Studio Professional 2015   
版本14.0.25123.00更新2   
MS .NET Framework   
版本4.6.01038

我不确定,为什么我遇到了这个问题,因为我遵循了MSDN教程中提到的相同步骤。 任何帮助将受到高度赞赏。

1 个答案:

答案 0 :(得分:1)

如果使用直接引用C ++ winmd而不是P2P引用,则会遇到此问题。这很容易检查.csproj:

例如,你的.csproj不应该有这一行:                         .. \调试\ Abc_def \ Abc_Def.winmd                

相反,请考虑使用以下内容:                {1ee77824-eaa8-40f1-9b56-6f8ffa44e727}           Abc_Def