C++/WinRT模板控制台应用与安装WinRT NuGet的C++控制台应用有何差异?
问题1:手动添加WinRT支持的C应用与官方C/WinRT模板应用的核心差异
- 全局属性配置差异:官方模板默认在项目文件首节点声明了
<CppWinRTEnabled>true</CppWinRT>全局属性,手动转换的项目通常仅安装了C++/WinRT NuGet包,未添加该属性。该属性会触发VS原生集成的C++/WinRT自动处理逻辑,而非仅依赖NuGet的基础注入逻辑。 - 编译参数预设差异:模板默认配置了符合WinRT运行要求的Windows SDK版本、最低C++17标准编译选项,以及正确的
cppwinrt.exe预生成步骤参数,手动转换的项目容易出现版本不匹配、编译参数遗漏的问题。 - 组件引用处理差异:模板项目会自动扫描同解决方案下的WinRT组件项目,自动生成对应C++投影头文件、自动拷贝组件输出文件到应用输出目录,手动转换的项目需要手动处理上述所有步骤。
- 运行时注册逻辑差异:模板项目默认配置了WinRT组件激活注册自动同步逻辑,无论是否打包为MSIX,都会自动将引用组件的类注册信息写入应用manifest,避免运行时类未注册错误,手动转换的项目没有该自动同步能力。
问题2:支持直接引用WinRT组件项目的核心配置
官方模板中支持直接引用WinRT组件项目的核心配置是项目文件中的<CppWinRTEnabled>true</CppWinRT>属性,该属性启用后VS项目系统会自动完成以下操作:
- 自动识别同解决方案下的WinRT组件项目引用,调用
cppwinrt.exe生成组件对应的C++投影代码,无需手动引用.winmd文件 - 自动将组件的输出文件(
.dll、.winmd)拷贝到应用输出目录 - 自动同步应用manifest文件,添加WinRT类的激活注册信息,解决你遇到的
REGDB_E_CLASSNOTREG运行时报错
补充建议
你遇到的运行时错误本质是仅手动引用.winmd只解决了编译期符号问题,运行时系统找不到对应WinRT类的注册信息。你只需在手动转换的项目文件的首个<PropertyGroup>节点中添加<CppWinRTEnabled>true</CppWinRT>,删除之前手动添加的.winmd引用,重新添加同解决方案下的WinRT组件项目引用即可解决问题,无需使用C++/CLI封装方案。
内容的提问来源于stack exchange,提问作者Thomas T
相关产品推荐
相关产品推荐

