Skip to content

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

@tpoint75

Description

@tpoint75

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?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions