YexuanXiao.CppWinRTPlus 2.1.260418.2

Requires NuGet 2.5 or higher.

dotnet add package YexuanXiao.CppWinRTPlus --version 2.1.260418.2
                    
NuGet\Install-Package YexuanXiao.CppWinRTPlus -Version 2.1.260418.2
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="YexuanXiao.CppWinRTPlus" Version="2.1.260418.2" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="YexuanXiao.CppWinRTPlus" Version="2.1.260418.2" />
                    
Directory.Packages.props
<PackageReference Include="YexuanXiao.CppWinRTPlus" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add YexuanXiao.CppWinRTPlus --version 2.1.260418.2
                    
#r "nuget: YexuanXiao.CppWinRTPlus, 2.1.260418.2"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package YexuanXiao.CppWinRTPlus@2.1.260418.2
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=YexuanXiao.CppWinRTPlus&version=2.1.260418.2
                    
Install as a Cake Addin
#tool nuget:?package=YexuanXiao.CppWinRTPlus&version=2.1.260418.2
                    
Install as a Cake Tool

YexuanXiao.CppWinRTPlus NuGet Package

Please read the repository's README.md for usage instructions.

Changelog

C++/WinRT Plus can now be compiled as C++ modules. Compared to PCH, using C++ modules will reduce memory requirements by more than half.

2026/04/18: Now all the files you write that use C++/WinRT can be modularized, including those for XAML. See the tutorial for how.

2026/03/24: Support using lambdas with explicit object parameter as delegates to resolve the issue where the captured lifetime may be shorter than the lifetime of the coroutine frame.

2026/03/22: No longer generate #pragma pop/push("WINRT_EXPORT"), and no longer generate winrt.ixx, because this prevented mixing modules and header files in some cases.

2026/03/14: As part of the modernization to C++20, C++/WinRT Plus now use concepts instead of enable_if and void_t, and leverage hidden friends and defaulted comparisons (including three-way comparison) to avoid ambiguity in overload resolution, all of which also help speed up compilation.

2026/03/06: Reduces header file size by 1/4, pch file size by 1/10 and compilation time by 1/10.

2026/02/25: The NuGet package now includes cppwinrt.exe with x86, x64, and arm64.

2026/02/24: C++/WinRT Plus can now be compiled as C++ modules. See the blog post for details.

2026/02/22: Removed support for C++17 and C++/CX. Existing projects need to upgrade their C++ standard to C++20.

<hr>

The following content is from the original C++/WinRT documentation and remains a valuable resource.

Overview

Please visit Microsoft.Windows.CppWinRT for official Microsoft-signed builds of the NuGet package. See also the C++/WinRT VSIX, which provides C++/WinRT project templates and debug visualization.

To add build support for C++/WinRT vcxproj projects, add a reference to the Microsoft.Windows.CppWinRT NuGet package. This customizes your project's build rules to automatically generate C++/WinRT projection headers, enabling you to both consume and produce Windows Runtime classes.

C++/WinRT detects Windows metadata required by the project, from:

  • Platform winmd files in the SDK (both MSI and NuGet)
  • NuGet package references containing winmd files
  • Other project references producing winmd files
  • Raw winmd file references
  • Interface definition language (IDL) files in the project

For any winmd file discovered above, C++/WinRT creates reference (consuming) projection headers. Client code can simply #include these headers, which are created in the generated files directory (see below).

For any IDL file contained in the project, C++/WinRT creates component (producing) projection headers. In addition, C++/WinRT generates templates and skeleton implementations for each runtime class, under the generated files directory.

Details

C++/WinRT configures build rules for the following tools:

  • C++ compiler
  • C++/WinRT compiler
  • MdMerge utility
  • Midlrt utility
  • Xaml compiler

It sets the following project properties and item metadata:

Property Value Description
PreferredToolArchitecture x64 Enables the compiler to use more memory
CanReferenceWinRT true Enables native project references (e.g., to WinMD files)
GeneratedFilesDir *$(IntDir)Generated Files\ Sets the folder for C++/WinRT generated source files
XamlLanguage CppWinRT Directs the Xaml compiler to generate C++/WinRT code
ClCompile.CompileAsWinRT *false Enables ISO C++ compilation (disables C++/CX)
ClCompile.LanguageStandard *stdcpp20 Enables C++20 language features
ClCompile.AdditionalOptions /bigobj Enables support for large object files
ClCompile.AdditionalIncludeDirectories GeneratedFilesDir Adds $(GeneratedFilesDir) to the C++ include dirs
Link.AdditionalDependencies WindowsApp.lib Umbrella library for Windows Runtime imports
Midl.AdditionalOptions /reference ... Enables faster compilation with winmd references (versus idl imports)
Midl.EnableWindowsRuntime true Enables Windows Runtime semantics
Midl.MetadataFileName Unmerged%(Filename).winmd Generates unmerged metadata in a temporary location
Midl.GenerateClientFiles, GenerateServerFiles, GenerateStublessProxies, GenerateTypeLibrary, HeaderFileName, DllDataFileName, InterfaceIdentifierFileName, ProxyFileName, TypeLibraryName *nul, *None, *false Disable unnecessary output

*If not already set

Generated Files

The generated files directory created by C++/WinRT contains two subfolders:

  • sources: runtime class skeleton implementations
  • winrt: reference projection headers

Customizing

C++/WinRT behavior can be customized with these project properties:

Property Value Description
CppWinRTLibs *true | false Enables the Link item metadata settings above
CppWinRTModernIDL *true | false Enables the Midl item metadata settings above
CppWinRTVerbosity low | *normal | high Sets the importance of C++/WinRT build messages (see below)
CppWinRTNamespaceMergeDepth *1 Sets the depth of namespace merging (Xaml apps require 1)
CppWinRTRootNamespaceAutoMerge true | *false Sets the namespace merge depth to be the length of the root namespace
CppWinRTMergeNoValidate true | *false Disables mdmerge validation
CppWinRTUsePrefixes *true | false Uses a dotted prefix namespace convention (versus a nested folder convention)
CppWinRTUseModules true | *false Generate C++ modules (ixx) for each namespaces
CppWinRTPath ...\cppwinrt.exe NuGet package-relative path to cppwinrt.exe, for custom build rule invocation
CppWinRTParameters "" Custom cppwinrt.exe command-line parameters (be sure to append to existing)
CppWinRTFastAbi true | *false Enables Fast ABI feature for both consuming and producing projections
CppWinRTOptimized true | *false Enables component projection optimization features
CppWinRTGenerateWindowsMetadata true | *false Indicates whether this project produces Windows Metadata
CppWinRTEnableDefaultPrivateFalse true | *false Indicates whether this project uses C++/WinRT optimized default for copying binaries to the output directory

*Default value

To customize common C++/WinRT project properties:

  • right-click the project node
  • expand the Common Properties item
  • select the C++/WinRT property page

Exclude what you don't want

You can prevent unnecessary namespaces from being generated, such as, by adding a CppWinRT.config file to the solution directory. Since some modules are very large, this can effectively reduce compilation time.

The format of the configuration file is:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <include>
        <prefix>Windows.Foundation</prefix>
    </include>
    <exclude>
        <prefix>Windows.UI.Xaml</prefix>
        <prefix>Windows.ApplicationModel.Store</prefix>
    </exclude>
</configuration>

It is equivalent to passing -config <path\ to cppwinrt.exe, which combines the -include and -exclude options.

Note that namespace exclusion occurs at a very early stage of the build process, so a clean build needs to be performed for it to take effect.

It's suggest excluding Windows.UI.Xaml and Windows.ApplicationModel.Store, as the latter depends on the former. By excluding Windows.UI.Xaml, the BMI size can be reduced by one-third.

Using C++ modules

When writing a module, you should ensure that any third-party library includes are placed before export module. All module tutorials will teach this.

When consuming a module, you need to ensure that all third-party includes are placed before import. For details on how to consume XAML modules, refer to the explanation below.

Make XAML modular

XAML components written with C++/WinRT typically have two files: Class.xaml.h and Class.xaml.cpp. To make them modular, rewrite Class.xaml.h as follows:

#pragma once

#include "Class.g.h"

namespace winrt::Project::implementation
{
    // Implementation code
}

namespace winrt::Project::factory_implementation
{
    // Implementation code
}

Then, rewrite ClassName.xaml.cpp as follows:

#define WINRT_CONSUME_MODULE

// Due to current limitations in the XAML Compiler implementation, you need to import all XAML dependencies before including ClassName.xaml.h
import Microsoft.UI.Xaml.Markup;

// Here, you need to import all dependencies of the Class's interface

#include "Class.xaml.h"
#if __has_include("Detail.g.cpp")
#include "Detail.g.cpp"
#endif

namespace winrt::Project::implementation
{
    // Implementation code
}

Additionally, you can disbale pch for Class.xaml.cpp.

Note that App.xaml.h has a special form. You also need to add the following right before #include "App.xaml.h":

#define COM_NO_WINDOWS_H
#define __unknwn_h__
#define __RPC_H__
#define __RPCNDR_H__
#define _INC_WINAPIFAMILY
#define _INC_WINDOWS
#define _INC_SDKDDKVER

#define _FUNCTIONAL_
#define _VECTOR_
#define _MAP_
#define _MUTEX_

You can refer to this example to modularize your project.

InitializeComponent

In older versions of C++/WinRT, Xaml objects called InitializeComponent from constructors. This can lead to memory corruption if InitializeComponent throws an exception.

void MainPage::MainPage()
{
    // This pattern should no longer be used
    InitializeComponent();
}

C++/WinRT now calls InitializeComponent automatically and safely, after object construction. Explicit calls to InitializeComponent from constructors in existing code should now be removed. Multiple calls to InitializeComponent are idempotent.

If a Xaml object needs to access a Xaml property during initialization, it should override InitializeComponent:

void MainPage::InitializeComponent()
{
    // Call base InitializeComponent() to register with the Xaml runtime
    MainPageT::InitializeComponent();
    // Can now access Xaml properties
    MyButton().Content(box_value(L"Click"));
}

A non-Xaml object can also participate in two-phase construction by defining an InitializeComponent method.

void MyComponent::InitializeComponent()
{
    // Execute initialization logic that may throw 
}

[Windows|Microsoft]::UI::Xaml::Markup::ComponentConnectorT

A consequence of calling InitializeComponent outside construction is that Xaml runtime callbacks to IComponentConnector::Connect and IComponentConnector2::GetBindingConnector are now dispatched to the most derived implementations. Previously, these calls were dispatched directly to the class under construction, as the vtable had yet to be initialized. For objects with markup that derive from composable base classes with markup, this is a breaking change. Derived classes must now implement IComponentConnector::Connect and IComponentConnector2::GetBindingConnector by explicitly calling into the base class. The ComponentConnectorT template provides a correct implementation for these interfaces:

struct DerivedPage : winrt::Windows::UI::Xaml::Markup::ComponentConnectorT<DerivedPageT<DerivedPage>>

If overriding DerivedPage::InitializeComponent, ComponentConnectorT::InitializeComponent should be called instead of DerivedPageT::InitializeComponent:

void DerivedPage::InitializeComponent()
{
    // Call base InitializeComponent() to register with the Xaml runtime
    ComponentConnectorT::InitializeComponent();
    // Can now access Xaml properties from base or derived class
    MyBaseButton().Content(box_value(L"Click"));
}

Troubleshooting

The msbuild verbosity level maps to msbuild message importance as follows:

Verbosity Importance
q[uiet] n/a
m[inimal] high
n[ormal] normal+
d[etailed], diag[nostic] low+

For example, if the verbosity is set to minimal, then only messages with high importance are generated. However, if the verbosity is set to diagnostic, then all messages are generated.

The default importance of C++/WinRT build messages is 'normal', but this can be overridden with the CppWinRTVerbosity property to enable throttling of C++/WinRT messages independent of the overall verbosity level.

Example:

msbuild project.vcxproj /verbosity:minimal /property:CppWinRTVerbosity=high ...

For more complex analysis of build errors, the MSBuild Binary and Structured Log Viewer is highly recommended.

Building, Testing

Be sure to get the latest nuget.exe from nuget.org and place it in your path.

Build the package by running build_nuget.cmd from a developer environment command line. For testing pass a version number that is much higher than your currently installed, like:

c:\repos\cppwinrt> .\build_nuget.cmd 5.0.0.0

Add the cppwinrt repo directory as a nuget source location and update your projects' references to point at it, update project references, then rebuild a test/sample project.

Product Compatible and additional computed target framework versions.
native native is compatible. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

This package has no dependencies.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
2.1.260418.2 150 4/18/2026
2.1.260418.1 146 4/18/2026
2.1.260415.1 152 4/15/2026
2.1.260406.1 157 4/5/2026
2.1.260405.1 161 4/5/2026
2.1.260322.1 172 3/21/2026
2.1.260314.1 190 3/14/2026
2.1.260306.1 181 3/6/2026
2.1.260225.6 183 2/25/2026
2.1.260225.3 175 2/25/2026
2.1.260225.2 182 2/25/2026
2.1.260225.1 177 2/25/2026
2.1.260224.1 189 2/24/2026