如何修复 WinRT 的 Visual Studio 2022 错误 E1696
How do I fix Visual Studio 2022 Error E1696 for WinRT
当我在 Visual Studio 2022 中生成一个新的 WinRT 项目时,我得到错误 E1696 无法打开源文件“winrt/Windows.Foundation.h” 但是当我查看包含目录时文件确实存在于正确的位置。
通常一个构建 --> 清理解决方案然后一个构建 --> 构建解决方案就足以解决问题。给 Visual Studio 几秒钟的时间来完成任何后台工作。
如果失败,请尝试重新安装 Microsoft.Windows.CppWinRT NuGet 包。
- 转到工具 --> NuGet 包管理器 --> 管理解决方案的 NuGet 包...
- 在“NuGet 解决方案”窗格中,选择“已安装”选项。
- 在右侧 Window 中勾选项目名称旁边的复选框。
- 单击“卸载”按钮
- 然后在“更改预览”对话框中单击“确定”。
- 现在将删除 CPPWinRT 包。
- 更改为“NuGet 解决方案”窗格中的“浏览”选项。
- 在窗格的搜索文本框中键入“cppwinrt”。
- Select Microsoft.Windows.CppWinRt 包并安装它。
- 最后选择构建 --> 构建解决方案选项。
- 构建完成后,再给 Visual Studio 几秒钟时间来完成任何后台工作,错误应该会消失。
这是 C++/WinRT 工作方式的产物。虽然 header 文件确实存在于 Windows SDK 中,但这不是项目寻找它们的地方。相反,它们是在 Generated Files 目录下的源代码树中动态生成的。
因此,要解决此问题,您必须至少编译一次新创建的项目。这本身不足以让 IntelliSense 识别环境中的变化。为了帮助 IntelliSense,你将不得不 right-click 进入源代码编辑器,然后 select Rescan -> Rescan File.
完成后,所有 IntelliSense 错误都会消失,包括 E1696。
历史背景
很容易混淆为什么 C++/WinRT header 文件是 Windows SDK 的一部分,但 C++/WinRT VSIX 模板不使用它们。回顾 C++/WinRT 的历史有助于解释我们是如何落入这种境地的:
最初,代码生成器负责生成语言投影header文件(modern.exe,后改名为cppwinrt.exe) 未发布。相反,header 文件由 Kenny Kerr 生成,并通过他的 modern repo.
发布
通过 GitHub 存储库发布语言投影 header 文件并转移到 Microsoft 拥有的 cppwinrt repo 中,并继续作为 [=50] 多个版本的部署渠道=].
这对开发人员来说不是很方便,因此随着 Windows SDK 的发布 Windows 10,版本 1803 (10.0.17134.0) header 得到 added to the SDK(包括代码生成器)。这行得通,但也不是理想情况,因为 C++/WinRT 的发布周期现在与 Windows SDK 的发布周期相关联,大约为 6 个月。
解耦发布周期对于允许 C++/WinRT 按照自己的节奏发展、通过改进和错误修复提供频繁的更新至关重要。这是通过将代码生成器部署为 C++/WinRT 项目模板引用的 NuGet package 的一部分来实现的。 MSBuild 项目驱动语言投影 header 的生成,客户可以自由决定他们希望使用哪个版本的 C++/WinRT 库,通过 NuGet 包引用进行控制。
这就是今天的工作方式,但是语言投影 headers 不能再从 Windows SDK 中删除。它们已发布,客户依赖于在那里找到它们,并期望 SDK 更新不会破坏他们的构建。这就是 Windows SDK 包含 header 您不打算使用的文件的原因。
当我在 Visual Studio 2022 中生成一个新的 WinRT 项目时,我得到错误 E1696 无法打开源文件“winrt/Windows.Foundation.h” 但是当我查看包含目录时文件确实存在于正确的位置。
通常一个构建 --> 清理解决方案然后一个构建 --> 构建解决方案就足以解决问题。给 Visual Studio 几秒钟的时间来完成任何后台工作。
如果失败,请尝试重新安装 Microsoft.Windows.CppWinRT NuGet 包。
- 转到工具 --> NuGet 包管理器 --> 管理解决方案的 NuGet 包...
- 在“NuGet 解决方案”窗格中,选择“已安装”选项。
- 在右侧 Window 中勾选项目名称旁边的复选框。
- 单击“卸载”按钮
- 然后在“更改预览”对话框中单击“确定”。
- 现在将删除 CPPWinRT 包。
- 更改为“NuGet 解决方案”窗格中的“浏览”选项。
- 在窗格的搜索文本框中键入“cppwinrt”。
- Select Microsoft.Windows.CppWinRt 包并安装它。
- 最后选择构建 --> 构建解决方案选项。
- 构建完成后,再给 Visual Studio 几秒钟时间来完成任何后台工作,错误应该会消失。
这是 C++/WinRT 工作方式的产物。虽然 header 文件确实存在于 Windows SDK 中,但这不是项目寻找它们的地方。相反,它们是在 Generated Files 目录下的源代码树中动态生成的。
因此,要解决此问题,您必须至少编译一次新创建的项目。这本身不足以让 IntelliSense 识别环境中的变化。为了帮助 IntelliSense,你将不得不 right-click 进入源代码编辑器,然后 select Rescan -> Rescan File.
完成后,所有 IntelliSense 错误都会消失,包括 E1696。
历史背景
很容易混淆为什么 C++/WinRT header 文件是 Windows SDK 的一部分,但 C++/WinRT VSIX 模板不使用它们。回顾 C++/WinRT 的历史有助于解释我们是如何落入这种境地的:
最初,代码生成器负责生成语言投影header文件(modern.exe,后改名为cppwinrt.exe) 未发布。相反,header 文件由 Kenny Kerr 生成,并通过他的 modern repo.
发布通过 GitHub 存储库发布语言投影 header 文件并转移到 Microsoft 拥有的 cppwinrt repo 中,并继续作为 [=50] 多个版本的部署渠道=].
这对开发人员来说不是很方便,因此随着 Windows SDK 的发布 Windows 10,版本 1803 (10.0.17134.0) header 得到 added to the SDK(包括代码生成器)。这行得通,但也不是理想情况,因为 C++/WinRT 的发布周期现在与 Windows SDK 的发布周期相关联,大约为 6 个月。
解耦发布周期对于允许 C++/WinRT 按照自己的节奏发展、通过改进和错误修复提供频繁的更新至关重要。这是通过将代码生成器部署为 C++/WinRT 项目模板引用的 NuGet package 的一部分来实现的。 MSBuild 项目驱动语言投影 header 的生成,客户可以自由决定他们希望使用哪个版本的 C++/WinRT 库,通过 NuGet 包引用进行控制。
这就是今天的工作方式,但是语言投影 headers 不能再从 Windows SDK 中删除。它们已发布,客户依赖于在那里找到它们,并期望 SDK 更新不会破坏他们的构建。这就是 Windows SDK 包含 header 您不打算使用的文件的原因。