UWP C# 应用调用 Windows 用 C++ 编写的运行时组件
UWP C# app calling Windows Runtime Component written in C++
我正在尝试创建一个用 C++(c++-cx) 编写的 Windows 运行时 (WinRT) 组件,可以从我的 UWP C# 应用程序调用它。我关注了这个 MSDN Tutorial
一切顺利。我能够在 Windows-10 桌面和移动设备上构建 & 运行 上面 link 中指定的 code/sample
然后我尝试创建一个更简单的 WinRT 组件。我按照与上述教程相同的步骤操作。创建了一个 Windows 运行时组件项目 (File->New->Project->Visual C++ ->Windows->Universal->Windows Runtime Component(Universal Windows))
现在我的 class 只有一个函数,getNum 基本上 returns 一个 uint16
这是我的 Class 头文件
#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 项目时提供的相同 class 名称(Class1.h & Class1.cpp)。
这就是我从 C# 代码调用 WinRT class 的方式:
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 本地计算机)上构建 & 运行 我的代码,但是当我尝试在移动设备(x86 模拟器)上 运行或 ARM 设备),它失败并出现以下错误:
Exception thrown: 'System.IO.FileNotFoundException' in CS_WRT_sample.exe
The specified module could not be found. (Exception from HRESULT: 0x8007007E)**
这是我看到的堆栈跟踪:
System.StubHelpers.StubHelpers.GetWinRTFactoryObject(IntPtr pCPCMD)
at WRT_sample.Class1..ctor()
at CS_WRT_sample.MainPage.initWRT()
我的 VS-2015 详细信息:
MS Visual Studio Professional 2015
Version 14.0.25123.00 Update 2
MS .NET Framework
Version 4.6.01038
我不确定为什么会遇到这个问题,因为我按照 MSDN 教程中提到的相同步骤操作。
任何帮助将不胜感激。
如果您使用对 C++ winmd 的直接引用而不是 P2P 引用,您将 运行 参与其中。这很容易检查您的 .csproj:
例如,您的 .csproj 不应包含此行:
..\Debug\Abc_def\Abc_Def.winmd
相反,请考虑使用如下内容:
{1ee77824-eaa8-40f1-9b56-6f8ffa44e727}
Abc_Def
我正在尝试创建一个用 C++(c++-cx) 编写的 Windows 运行时 (WinRT) 组件,可以从我的 UWP C# 应用程序调用它。我关注了这个 MSDN Tutorial
一切顺利。我能够在 Windows-10 桌面和移动设备上构建 & 运行 上面 link 中指定的 code/sample
然后我尝试创建一个更简单的 WinRT 组件。我按照与上述教程相同的步骤操作。创建了一个 Windows 运行时组件项目 (File->New->Project->Visual C++ ->Windows->Universal->Windows Runtime Component(Universal Windows))
现在我的 class 只有一个函数,getNum 基本上 returns 一个 uint16
这是我的 Class 头文件
#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 项目时提供的相同 class 名称(Class1.h & Class1.cpp)。
这就是我从 C# 代码调用 WinRT class 的方式:
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 本地计算机)上构建 & 运行 我的代码,但是当我尝试在移动设备(x86 模拟器)上 运行或 ARM 设备),它失败并出现以下错误:
Exception thrown: 'System.IO.FileNotFoundException' in CS_WRT_sample.exe
The specified module could not be found. (Exception from HRESULT: 0x8007007E)**
这是我看到的堆栈跟踪:
System.StubHelpers.StubHelpers.GetWinRTFactoryObject(IntPtr pCPCMD)
at WRT_sample.Class1..ctor()
at CS_WRT_sample.MainPage.initWRT()
我的 VS-2015 详细信息:
MS Visual Studio Professional 2015
Version 14.0.25123.00 Update 2
MS .NET Framework
Version 4.6.01038
我不确定为什么会遇到这个问题,因为我按照 MSDN 教程中提到的相同步骤操作。 任何帮助将不胜感激。
如果您使用对 C++ winmd 的直接引用而不是 P2P 引用,您将 运行 参与其中。这很容易检查您的 .csproj:
例如,您的 .csproj 不应包含此行: ..\Debug\Abc_def\Abc_Def.winmd
相反,请考虑使用如下内容: {1ee77824-eaa8-40f1-9b56-6f8ffa44e727} Abc_Def