VS 2017和2019无法找到WinRT头文件,即使在新解决方案中。

3
所以我正在尝试使用“Windows 应用程序打包项目”将 Win32 应用程序更新为 UWP,但我遇到了文件系统问题,这是我预料到的并且正在努力解决。为了做到这一点,我需要访问 WinRT 库,以便处理 UWP 路径来获取我的资源和资产。
我安装了 C++/WinRT VSIX 扩展,并向我的解决方案添加了 NuGet 包。我认为根据我所读到的,这就是我需要访问头文件的全部内容。然而,编译器显然找不到 WinRT 和它的名称空间的头文件,因为我收到了“无法打开源文件 'winrt/Windows.Storage.h'”的消息,并且我无法使用我明显需要使我的文件系统代码工作的“Windows::Storage::StorageFolder”调用。尽管我尽最大努力弄清楚我缺少哪些包含路径,但什么都没用,所以我尝试了不同的策略。
在同一个解决方案中,我创建了一个“DirectX 12 App (Universal Windows)”项目,认为我可能走错了路,选择尝试将我的前端重新实现为一个直接的UWP应用程序,而不是使用旧的win32。这个新项目似乎有正确的包含内容,因为它使用的Windows.*命名空间的using指令可以工作,并且可以编译。尽管如此,我无法弄清楚它是如何访问类似于我需要的命名空间的,因此无法通过反向工程来使我的原始项目工作。然而,我怀疑这是否使用相同的库,因为这种项目类型在安装C++/WinRT VSIX扩展之前就已经存在,而WinRT没有被提及。
为了回归基础,我创建了一个全新的解决方案,使用“Windows桌面应用程序(C++/WinRT)”,因为我知道它使用了我需要的运行时,并且应该是干净的(与我的长期使用的解决方案相比,有大量的项目和配置),所以我可以看到它使用的选项,以便我复制并访问我需要的工具。然而,刚刚创建的项目将无法编译,并且引用了与我的原始解决方案和项目完全相同的原因,即找不到WinRT标头。这让我感到困惑,所以我认为这是我在VS2017中全局做的其他配置。
为了隔离这个问题,我安装了VS2019并添加了扩展,认为“新环境,没有配置错误”。但是,再次创建一个全新的“Windows桌面应用程序(C++/WinRT)”项目将无法构建,并且找不到头文件。
自动生成的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 SDK?例如,在我的电脑上,所有的winRT头文件都位于C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\winrt(10.0.19041.0是最新的SDK版本),Visual Studio也是使用这个路径。 - Simon Mourier
1
@SimonMourier 是的,但是为什么这不作为新项目的默认选项呢?我会认为项目的定位会处理这些事情,并且一个全新的项目应该可以从一开始就进行构建。我从未不得不手动添加Windows SDK到包含路径中,因此这种差异使我感到困惑。 - Force Gaia
@IInspectable,这可能是我所缺失的。但是我有点困惑。如果代码生成器应该在构建时使用模板运行,那么我不明白为什么它不会像“新开箱”一样构建。但是你给了我一个新的调查线索。我会回报的。 - Force Gaia
最近的扩展程序/nuget包中有一个bug https://github.com/microsoft/cppwinrt/pull/781 - mishmashru
@Force Gaia,你解决了吗?你能描述一下解决方案吗? - UgAr0FF
显示剩余2条评论
3个回答

0

我遇到了相同的错误信息,我通过添加以下内容来解决它:

%WindowsSdkDir%Include\WindowsTargetPlatformVersion\cppwinrt 将其添加到包含路径中或者只使用包含语句构建解决方案,这也会生成头文件并使winrt命名空间工作。

%WindowsSdkDir%可以通过从菜单工具、命令行中打开开发人员命令提示符并输入echo %WindowsSdkDir%来获取。

windowsTargetPlatformVersion可以从配置属性 - Windows SDK版本中复制。

详细说明请参见此链接。

https://learn.microsoft.com/en-us/windows/uwp/cpp-and-winrt-apis/get-started#important-apis


0

0

你需要添加一个对已安装在某个位置的Windows .winmd的引用

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

或者在VS目录中通过浏览引用窗口找到它,然后

你可以使用 "using Windows.Storage" 来包含必要的内容。我不确定,但我有一个Winform应用程序,在其中我使用了这个方法,它运行得很好,所以也许你可以试一试。


您不需要添加对系统提供的 .winmd 文件的引用。它们位于标准位置,构建系统会自动发现它们。这同样适用于通过 NuGet 导入的库。 - IInspectable
实际上,这是正确的答案,因为存在这个问题 https://github.com/microsoft/cppwinrt/issues/780 - mishmashru
using Windows.Storage 不是有效的 C++ 代码。我不确定你怎么能把它说成是“正确”的。 - IInspectable
@IInspectable 是的,但这不是重要的部分(我认为这只是一个打字错误)。重要的部分是“手动添加依赖项到Windows.winmd”,因为主要问题是编译器无法找到头文件,因为由于缺少依赖项而未生成。 - mishmashru

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接