当我在Visual Studio 2022中生成一个新的WinRT项目时,我得到错误E1696无法打开源文件“winrt/Windows. Foundation. h”,但当我查看包含目录时,文件确实存在于正确的位置。
zxlwwiss1#
这是C++/WinRT工作方式的一个工件。虽然头文件确实存在于Windows SDK中,但项目并不在那里查找它们。相反,它们是在 Generated Files 目录下的源代码树中动态生成的。所以要解决这个问题,你必须至少编译一次新创建的项目。这本身并不足以让智能感知捕捉环境中的变化。要帮助智能感知解决这个问题,你必须右键单击源代码编辑器,然后选择 Rescan -> Rescan File。一旦完成,所有的智能感知错误都会消失,包括E1696。
我们很容易搞不清楚为什么C++/WinRT头文件是Windows SDK的一部分,而C++/WinRT VSIX模板却没有使用它们。回顾一下C++/WinRT的历史有助于解释我们是如何陷入这种境地的:最初,负责生成语言投影头文件(modern.exe,后来更名为 cppwinrt.exe)的代码生成器并没有发布。相反,头文件由Kenny Kerr生成,并通过他的modern repo发布。通过GitHub存储库将语言投影头文件发布到微软拥有的cppwinrt repo中,并继续成为Windows多个版本的部署渠道。这对开发人员来说并不方便,因此随着Windows 10的Windows SDK版本1803(10.0.17134.0)的发布,头文件被添加到SDK(包括代码生成器)。这起作用了,但也不是一个理想的情况,因为C++/WinRT的发布周期现在与Windows SDK的发布周期挂钩,大约6个月。解耦发布周期对于允许C++/WinRT以自己的速度发展至关重要,并通过改进和错误修复频繁更新。这是通过将代码生成器部署为C++/WinRT项目模板引用的NuGet package的一部分来实现的。MSBuild项目驱动语言投影头的生成,客户端可以自由决定,他们希望使用哪个版本的C++/WinRT库,通过NuGet包参考进行控制。这就是今天的工作方式,但是语言投影头文件再也不能从Windows SDK中提取出来了。它们已经发布了,客户端依赖于在那里找到它们,并期望SDK更新不会破坏他们的构建。这就是为什么Windows SDK包含您不应该使用的头文件。
7uzetpgm2#
通常一个Build --> Clean Solution,然后一个Build --> Build Solution就足以解决问题。给予Visual Studio几秒钟的时间来完成任何后台工作。如果失败,请尝试重新安装Microsoft.Windows.CppWinRT NuGet软件包。1.转到工具--> NuGet包管理器-->管理解决方案的NuGet包.1.在NuGet解决方案窗格中选择已安装选项。1.勾选窗口右侧项目名称旁边的复选框。1.单击“取消”按钮1.然后在“更改预览”对话框中单击“确定”。
wi3ka0sx3#
我下载的一个示例程序也遇到了类似的问题,这个程序来自一个相当过时的网页,E1696的问题是找不到stdio. h。底线:右键单击项目>重新定位项目。
3条答案
按热度按时间zxlwwiss1#
这是C++/WinRT工作方式的一个工件。虽然头文件确实存在于Windows SDK中,但项目并不在那里查找它们。相反,它们是在 Generated Files 目录下的源代码树中动态生成的。
所以要解决这个问题,你必须至少编译一次新创建的项目。这本身并不足以让智能感知捕捉环境中的变化。要帮助智能感知解决这个问题,你必须右键单击源代码编辑器,然后选择 Rescan -> Rescan File。
一旦完成,所有的智能感知错误都会消失,包括E1696。
我们很容易搞不清楚为什么C++/WinRT头文件是Windows SDK的一部分,而C++/WinRT VSIX模板却没有使用它们。回顾一下C++/WinRT的历史有助于解释我们是如何陷入这种境地的:
最初,负责生成语言投影头文件(modern.exe,后来更名为 cppwinrt.exe)的代码生成器并没有发布。相反,头文件由Kenny Kerr生成,并通过他的modern repo发布。
通过GitHub存储库将语言投影头文件发布到微软拥有的cppwinrt repo中,并继续成为Windows多个版本的部署渠道。
这对开发人员来说并不方便,因此随着Windows 10的Windows SDK版本1803(10.0.17134.0)的发布,头文件被添加到SDK(包括代码生成器)。这起作用了,但也不是一个理想的情况,因为C++/WinRT的发布周期现在与Windows SDK的发布周期挂钩,大约6个月。
解耦发布周期对于允许C++/WinRT以自己的速度发展至关重要,并通过改进和错误修复频繁更新。这是通过将代码生成器部署为C++/WinRT项目模板引用的NuGet package的一部分来实现的。MSBuild项目驱动语言投影头的生成,客户端可以自由决定,他们希望使用哪个版本的C++/WinRT库,通过NuGet包参考进行控制。
这就是今天的工作方式,但是语言投影头文件再也不能从Windows SDK中提取出来了。它们已经发布了,客户端依赖于在那里找到它们,并期望SDK更新不会破坏他们的构建。这就是为什么Windows SDK包含您不应该使用的头文件。
7uzetpgm2#
通常一个Build --> Clean Solution,然后一个Build --> Build Solution就足以解决问题。给予Visual Studio几秒钟的时间来完成任何后台工作。
如果失败,请尝试重新安装Microsoft.Windows.CppWinRT NuGet软件包。
1.转到工具--> NuGet包管理器-->管理解决方案的NuGet包.
1.在NuGet解决方案窗格中选择已安装选项。
1.勾选窗口右侧项目名称旁边的复选框。
1.单击“取消”按钮
1.然后在“更改预览”对话框中单击“确定”。
1.更改为NuGet解决方案窗格中的浏览选项。
1.在窗格的“搜索”文本框中键入“cppwinrt”。
1.选择Microsoft.Windows.CppWinRt软件包并安装它。
1.最后选择Build --> Build Solution选项。
1.构建完成后,给予Visual Studio几秒钟的时间来完成任何后台工作,错误应该会消失。
wi3ka0sx3#
我下载的一个示例程序也遇到了类似的问题,这个程序来自一个相当过时的网页,E1696的问题是找不到stdio. h。
底线:右键单击项目>重新定位项目。