VS 2017 和 2019 找不到 WinRT header 文件,即使是在全新的解决方案上

VS 2017 & 2019 cannot find the WinRT header files, even on a fresh solution

所以我尝试使用“Windows 应用程序打包项目”将 Win32 应用程序更新到 UWP,我遇到了文件系统问题,这是我预料到的,并且正在尝试解决这些问题。为此,我需要访问 WinRT 库,以便我可以处理 UWP 路径以获取我的资产和资源。

我安装了 C++/WinRT VSIX 扩展并将 NuGet 包添加到我的解决方案中。我假设 from what i read 这就是我访问 header 文件所需要做的一切。 但是编译器显然找不到 WinRT 的 header 文件和它的命名空间 ,因为我收到消息说 cannot open source file "winrt/Windows.Storage.h 并且我不能使用 Windows::Storage::StorageFolder 调用我显然需要让我的文件系统代码工作。尽管我尽了最大努力找出我缺少的包含路径,但没有任何效果,所以我尝试了一种不同的策略。

在同一个解决方案中,我创建了一个“DirectX 12 应用程序(通用 Windows)”,认为我可能走错了路,并选择看看我是否可以 re-implement 我的前面最终成为没有遗留 win32 的纯 UWP 应用程序。这个新项目似乎有正确的包含,因为 using 指令适用于它使用的 Windows.* 命名空间,并且可以编译。尽管如此,我无法弄清楚它在做什么来获取与我需要的类似的访问命名空间,所以我无法对其进行逆向工程以使我的原始项目正常工作。但是,我怀疑这是否使用相同的库,因为在我安装 C++/WinRT VSIX 扩展之前就可以使用此项目类型,并且在任何地方都没有提到 WinRT。

为了回归基础,我使用“Windows 桌面应用程序 (C++/WinRT)”创建了一个新的解决方案,因为我知道它使用了我所追求的运行时,它应该是干净(与我的 long-used 具有大量项目和配置的解决方案相反),因此我可以看到它用于复制和访问我需要的工具的选项。但是,新创建的项目将无法编译,它引用的原因与我原来的解决方案和项目关于无法找到 WinRT headers 的原因完全相同。这让我感到困惑,所以我认为这是我在全球范围内对 VS2017 进行的一些其他配置。

为了隔离这个问题,我安装了 VS2019 并向其添加了扩展,认为“新环境,没有配置问题”。但是,新创建的“Windows 桌面应用程序 (C++/WinRT)”项目无法构建,并且找不到 header 文件。

自动生成的 pch.h 包含以下内容

//it can't find anything starting with "winrt/"
#include <winrt/Windows.Foundation.h>
#include <winrt/Windows.Foundation.Collections.h>
#include <winrt/Windows.System.h>
#include <winrt/Windows.UI.Xaml.h>
#include <winrt/Windows.UI.Xaml.Controls.h>
#include <winrt/Windows.UI.Xaml.Hosting.h>
#include <winrt/Windows.UI.Xaml.Media.h>
//but it finds this one totally fine
#include <Windows.UI.Xaml.Hosting.DesktopWindowXamlSource.h>

所以这在新旧解决方案文件以及 VS2017 和 VS2019 中都会发生。我正式对发生的事情感到困惑。

任何人都可以阐明我所缺少的东西,这样我就可以获得我的 win32 应用程序或新创建的 WinRT 项目来构建吗?

您必须添加对 windows .winmd 安装在某处的引用

C:\Program Files (x86)\Windows Kits\UnionMetadata\Windows.winmd

或通过浏览参考文献 window 然后在 vs 目录中的某处

你可以使用“using Windows.Storage”来包含必要的东西 我不确定,但我有一个 winform 应用程序,我在其中使用了它并且运行良好所以也许你可以试一试

此问题已由 https://github.com/microsoft/cppwinrt/pull/781 修复 更新您的 MSIX 和 NuGet 程序包