创建 C++ WinRT 组件
通过 Cpp/WinRT 项目模板创建一个 WinRT 组件工程 CppWinrtComponent.vcxproj,主要接口定义如下:
namespace CppWinrtComponent
{
[default_interface]
runtimeclass Class
{
Class();
String GetModule();
}
}
最终该项目 CppWinrtComponent 可以被编译生成两个 WinRT 组件的核心部分:
- CppWinrtComponent.winmd, 提供接口描述
- CppWinrtComponent.dll, 负责接口实现,基于 COM 技术
由于该项目 CppWinrtComponent.vcxproj 默认的平台是 Universal Windows,所以它使用的 VC 运行时函数都是 Store 版本,这导致在非 Universal Windows 应用中会出现找不到 VC 运行时库的异常。为了解决这个问题,针对该类型项目,Visual Studio 2019 version 16.9 版本开始支持属性 Windows Desktop Compatible,设置该属性后所有的 VC 运行时函数会被链接到 Deskotp 版本。
该属性可以在 VS 项目属性面板中配置,对应的 vcxproj 中配置如下:
<PropertyGroup>
<DesktopCompatible>true</DesktopCompatible>
</PropertyGroup>
消费 C++ WinRT 组件
本文主要讨论在如下语言、框架中使用该组件:
- C++ Desktop
- C++ UWP
- .Net Framework Desktop
- .Net5 Desktop
C++ Desktop
使用 VS 的 C++ 项目模板,创建一个空的控制台应用程序 ConsumerCppConsole.vcxproj。
1. 使用 Nuget 包管理器给该项目安装 Microsoft.Windows.CppWinRT
建议安装最新版本,在 Microsoft.Windows.CppWinRT 2.0.200115.8 之后版本中,引入了对 Reg Free 的支持,可以简化 WinRT 组件使用流程,不需要创建额外的 Manifest 文件。
2. 添加对项目 CppWinrtComponent 生成的 CppWinrtComponent.WinMD 的引用
不能直接在 VS 中添加对项目 CppWinrtComponent.vcxproj 的工程引用,但是可以直接添加对文件 CppWinrtComponent.winmd 的引用,在该文件引用的属性中,VS 默认会把”Copy Local” 设置为 True,该操作会导致 CppWinrtComponent.dll 在