TJA*_*TJA 2 c++ visual-studio c++-winrt
当我在 Visual Studio 2022 中生成新的 WinRT 项目时,出现错误 E1696 无法打开源文件“winrt/Windows.Foundation.h”,但当我查看包含目录时,文件确实存在于正确的位置。
这是 C++/WinRT 工作方式的产物。虽然头文件确实存在于 Windows SDK 中,但这并不是项目寻找它们的地方。相反,它们是动态生成到源树的“生成的文件”目录下的。
因此,要解决此问题,您必须至少编译一次新创建的项目。这本身不足以让 IntelliSense 感知环境的变化。为了帮助 IntelliSense,您必须右键单击源代码编辑器,然后选择Rescan -> Rescan File。
完成此操作后,所有 IntelliSense 错误都会消失,包括 E1696。
历史背景
人们很容易感到困惑,为什么 C++/WinRT 头文件是 Windows SDK 的一部分,而 C++/WinRT VSIX 模板却没有使用它们。回顾 C++/WinRT 的历史有助于解释我们如何陷入这种情况:
最初,负责生成语言投影头文件(modern.exe,后来重命名为cppwinrt.exe)的代码生成器没有发布。相反,头文件是由 Kenny Kerr 生成的,并通过他的现代存储库发布。
通过 GitHub 存储库发布语言投影头文件,该存储库被转移到Microsoft 拥有的cppwinrt 存储库中,并且仍然是多个 Windows 版本的部署渠道。
这对于开发人员来说不太方便,因此随着适用于 Windows 10 的 Windows SDK 版本 1803 (10.0.17134.0) 的发布,标头被添加到 SDK(包括代码生成器)中。这确实有效,但也不是理想的情况,因为 C++/WinRT 的发布周期现在与 Windows SDK 的发布周期挂钩,大约为 6 个月。
解耦发布周期对于让 C++/WinRT 按照自己的节奏前进、通过改进和错误修复进行频繁更新至关重要。这是通过将代码生成器部署为C++/WinRT 项目模板引用的NuGet 包的一部分来实现的。MSBuild 项目驱动语言投影标头的生成,客户可以自由决定他们希望使用哪个版本的 C++/WinRT 库,并通过 NuGet 包引用进行控制。
这就是现在的工作方式,但语言投影标头无法再从 Windows SDK 中删除。它们已发布,客户依赖在那里找到它们,并期望 SDK 更新不会破坏他们的构建。这就是为什么 Windows SDK 包含您不应该使用的头文件。
| 归档时间: |
|
| 查看次数: |
8060 次 |
| 最近记录: |