Hacktoberfest 2026:メンテナが10月に向けて印を付けた、オープンで初心者向けの issue。 Hacktoberfest の issue を見る

Bug: Incremental build with C++/WinRT 3.0 modules loses CppWinRTPlatformWinMDReferences, causing Windows.Foundation.Point could not be found

オープン
#1,587 コメント 3 件 リアクション 0 件 担当者 0 名 GitHub で見る

メンテナーはふだん 1 日以内に返信

まだ誰も着手していません。

評価

難易度
4/5
見積もり時間
3〜5日
初心者へのやさしさ
48/100
issue の種類
バグ
明瞭さ
おおむね明確
活発さ
静か
技術スタック
cpp

調査の方向性

Microsoft.Windows.CppWinRT.targets の CppWinRTMakeReferenceProjection 周辺と、CppWinRTPlatformWinMDReferences の入力を調査します。CppWinRTConsumeModule を使用するモジュールプロバイダーについて、クリーンビルドとインクリメンタルビルドの両方を再現し、生成された cppwinrt_ref.rsp の内容を比較します。インクリメンタルビルドに Windows SDK コントラクトの WinMD 参照が含まれ、Windows.Foundation.Point の解決に失敗しなくなれば完了です。

索引モデルが issue の本文から書いたものです。

説明

Version

3.0.260520.1

Summary

I am migrating a WinAppSDK C++/WinRT project to the new C++/WinRT 3.0 module build.

The solution uses a dedicated module provider project:

<ProjectReference Include="..\..\CppWinRTModules\CppWinRTModules.vcxproj">
  <Project>{...}</Project>
  <CppWinRTConsumeModule>true</CppWinRTConsumeModule>
</ProjectReference>

A clean/rebuild works, but an incremental build fails during the C++/WinRT reference projection step.

The failure occurs when cppwinrt processes Microsoft.Graphics.winmd from the WinAppSDK experimental packages:

cppwinrt : error Type 'Windows.Foundation.Point' could not be found
 method: RedPrimary
 type: Microsoft.Graphics.Display.IDisplayAdvancedColorInfo
 database: ...\packages\Microsoft.WindowsAppSDK.InteractiveExperiences.2.0.14-experimental\metadata\10.0.18362.0\Microsoft.Graphics.winmd

The project does not use RedPrimary directly. This appears to happen while processing the metadata database.

Environment

Visual Studio: 18 Professional
MSVC: 14.51.36231
C++/WinRT NuGet: Microsoft.Windows.CppWinRT 3.0.260520.1
Windows SDK: 10.0.26100.0
Configuration: x64 Release / x64 Debug
WindowsAppSDK packages include:
  Microsoft.WindowsAppSDK.2.1.4-experimental8
  Microsoft.WindowsAppSDK.Foundation.2.0.22-experimental
  Microsoft.WindowsAppSDK.WinUI.2.1.1-experimental
  Microsoft.WindowsAppSDK.InteractiveExperiences.2.0.14-experimental
  Microsoft.WindowsAppSDK.AI.2.1.13-experimental
  Microsoft.WindowsAppSDK.Search.2.1.13-experimental
  Microsoft.WindowsAppSDK.Widgets.2.0.6-experimental
Reproducible example

Expected behavior

During the failing incremental build, the C++/WinRT diagnostic output shows that the direct WinMD references are present, but the platform WinMD references are empty:

CppWinRTPlatformWinMDReferences:
CppWinRTDirectWinMDReferences:
  ...\Microsoft.Graphics.winmd
  ...\Microsoft.UI.winmd
  ...\Microsoft.UI.Xaml.winmd
  ...

Then the generated command runs:

cppwinrt @"x64\Release\CppWinRTModules.vcxproj.cppwinrt_ref.rsp"

The tool output shows many in: entries for WinAppSDK package WinMDs, but no corresponding Windows SDK ref: entries. Therefore Microsoft.Graphics.winmd cannot resolve Windows.Foundation.Point.

After adding a workaround target, the same build succeeds. The log then shows CppWinRTPlatformWinMDReferences and CppWinRTPlatformWinMDInputs populated with the Windows SDK contract WinMDs such as Windows.Foundation.FoundationContract.winmd, Windows.Foundation.UniversalApiContract.winmd, Windows.Networking.Connectivity.WwanContract.winmd, etc.

Actual behavior

Clean/rebuild succeeds.

Incremental build fails because CppWinRTPlatformWinMDReferences is empty when CppWinRTMakeReferenceProjection runs, causing cppwinrt_ref.rsp to omit Windows SDK references.

Additional comments

Workaround

Adding this target to the project repairs the incremental build:

<Target Name="ForceCppWinRTPlatformWinMDReferences"
        BeforeTargets="CppWinRTMakeReferenceProjection">

  <ItemGroup Condition="'@(CppWinRTPlatformWinMDReferences)' == ''">
    <CppWinRTPlatformWinMDReferences Include="$(WindowsSDK_MetadataPathVersioned)\**\*.winmd" />
  </ItemGroup>

  <Message Text="Forced CppWinRTPlatformWinMDReferences from $(WindowsSDK_MetadataPathVersioned)"
           Importance="High"
           Condition="'@(CppWinRTPlatformWinMDReferences)' != ''" />

</Target>

After this, the build succeeds because the Windows SDK WinMDs are passed into the C++/WinRT projection step.

Notes

I also tried:
<CppWinRTEnableReferenceProjection>false</CppWinRTEnableReferenceProjection>
but that is not viable because the module provider then no longer generates required modules such as:

import winrt.Microsoft.UI;
import winrt.Microsoft.UI.Dispatching;
import winrt.Microsoft.UI.Xaml;
import winrt.Microsoft.UI.Xaml.Controls;
import winrt.Microsoft.UI.Xaml.Media;

I also tried excluding Microsoft.Graphics.Display, but that caused the module provider to generate almost no WinRT namespace modules, so that is not a usable workaround either.

The issue seems to be specifically that the incremental CppWinRTMakeReferenceProjection path does not populate CppWinRTPlatformWinMDReferences, while clean/rebuild does.

Minimal question

Is this expected behavior for C++/WinRT 3.0 module provider projects using true?

If not, should Microsoft.Windows.CppWinRT.targets ensure that CppWinRTPlatformWinMDReferences is populated before CppWinRTMakeReferenceProjection during incremental builds?

主要言語
C++
スター
1.9k
フォーク
281
PR マージ指標
30日以内にマージされた PR はありません

環境構築

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

microsoft/cppwinrt のほかの issue

microsoft/cppwinrt の issue をすべて見る

似ている issue

C++ の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。