{"id":938,"date":"2026-03-02T11:22:45","date_gmt":"2026-03-02T19:22:45","guid":{"rendered":"https:\/\/devblogs.microsoft.com\/ifdef-windows\/?p=938"},"modified":"2026-03-02T11:22:45","modified_gmt":"2026-03-02T19:22:45","slug":"windows-app-development-cli-v0-2-net-support-manifest-placeholders-winapp-store-and-more","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/ifdef-windows\/windows-app-development-cli-v0-2-net-support-manifest-placeholders-winapp-store-and-more\/","title":{"rendered":"Windows App Development CLI v0.2: .NET support, manifest placeholders, &#8220;winapp store&#8221; and more!"},"content":{"rendered":"<p><a href=\"https:\/\/devblogs.microsoft.com\/ifdef-windows\/wp-content\/uploads\/sites\/61\/2026\/02\/winapp-cli-v0.2-banner-1.webp\"><img decoding=\"async\" class=\"alignnone wp-image-948\" src=\"https:\/\/devblogs.microsoft.com\/ifdef-windows\/wp-content\/uploads\/sites\/61\/2026\/02\/winapp-cli-v0.2-banner-1-300x158.webp\" alt=\"winapp cli v0 2 banner image\" width=\"799\" height=\"421\" srcset=\"https:\/\/devblogs.microsoft.com\/ifdef-windows\/wp-content\/uploads\/sites\/61\/2026\/02\/winapp-cli-v0.2-banner-1-300x158.webp 300w, https:\/\/devblogs.microsoft.com\/ifdef-windows\/wp-content\/uploads\/sites\/61\/2026\/02\/winapp-cli-v0.2-banner-1-1024x538.webp 1024w\" sizes=\"(max-width: 799px) 100vw, 799px\" \/><\/a><\/p>\n<p>Windows App Development CLI v0.2 is here! This release is driven largely by community feedback and packs in native .NET project support, manifest placeholders that eliminate hardcoded executable names, Microsoft Store Developer CLI integration, a revamped help experience, and more. Get the update by running <code>winget install Microsoft.WinAppCLI<\/code> or <a href=\"https:\/\/github.com\/microsoft\/winappCli\">check the repo for other install options<\/a>.<\/p>\n<p><div  class=\"d-flex justify-content-left\"><a class=\"cta_button_link btn-primary mb-24\" href=\"https:\/\/github.com\/microsoft\/winappCli\" target=\"_blank\">Get started with the Windows App Development CLI<\/a><\/div><\/p>\n<p>Let\u2019s dive in!<\/p>\n<h2>\ud83d\udfe3 First-class .NET project support<\/h2>\n<p>This was one of our most requested features. .NET projects (WinUI, WPF, WinForms, console apps) now work natively with winapp CLI. No more winapp.yaml for .NET. Just run winapp init in a folder with a .csproj and the tool takes care of the rest.<\/p>\n<p>Here\u2019s what happens under the hood:<\/p>\n<ul>\n<li>Your TargetFramework is validated and updated to target the right Windows SDK version<\/li>\n<li>NuGet references (WindowsAppSDK, Microsoft.Windows.SDK.BuildTools, and related build tools) are added directly to your .csproj<\/li>\n<li>An xml and Assets folder are generated automatically<\/li>\n<\/ul>\n<pre class=\"prettyprint language-default\"><code class=\"language-default\"># Detects .csproj, configures NuGet references, generates appxmanifest.xml\r\nwinapp init\r\n<\/code><\/pre>\n<p class=\"FirstParagraph\" style=\"line-height: 115%;\">From there, getting a package identity for local debugging is just one command:<\/p>\n<pre class=\"prettyprint language-default\"><code class=\"language-default\">&gt; winapp create-debug-identity app.exe\r\n&gt; app.exe<\/code><\/pre>\n<p>Pro tip: wire this up as an MSBuild target so it runs automatically after every Debug build. The <a href=\"https:\/\/github.com\/microsoft\/winappCli\/blob\/main\/docs\/guides\/dotnet.md\"><em>.NET guide<\/em><\/a> walks through the full setup, including WPF and WinForms.<\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/ifdef-windows\/wp-content\/uploads\/sites\/61\/2026\/02\/dotnet-support.webp\"><img decoding=\"async\" class=\"alignnone wp-image-951\" src=\"https:\/\/devblogs.microsoft.com\/ifdef-windows\/wp-content\/uploads\/sites\/61\/2026\/02\/dotnet-support-300x108.webp\" alt=\"dotnet support image\" width=\"828\" height=\"298\" srcset=\"https:\/\/devblogs.microsoft.com\/ifdef-windows\/wp-content\/uploads\/sites\/61\/2026\/02\/dotnet-support-300x108.webp 300w, https:\/\/devblogs.microsoft.com\/ifdef-windows\/wp-content\/uploads\/sites\/61\/2026\/02\/dotnet-support-1024x368.webp 1024w, https:\/\/devblogs.microsoft.com\/ifdef-windows\/wp-content\/uploads\/sites\/61\/2026\/02\/dotnet-support-768x276.webp 768w, https:\/\/devblogs.microsoft.com\/ifdef-windows\/wp-content\/uploads\/sites\/61\/2026\/02\/dotnet-support.webp 1066w\" sizes=\"(max-width: 828px) 100vw, 828px\" \/><\/a><\/p>\n<h2 style=\"line-height: 115%;\">\ud83d\udcc4 Manifest placeholders<\/h2>\n<p>No more hardcoding executable names in your AppxManifest.xml! You can now use Visual Studio-style placeholders (<code>$targetnametoken$<\/code> and <code>$targetentrypoint$<\/code>) and the values get resolved automatically at packaging time.<\/p>\n<pre class=\"prettyprint language-xml\"><code class=\"language-xml\">&lt;!-- Before: hardcoded --&gt;\r\n&lt;Application Id=\"App\" Executable=\"MyApp.exe\"&gt;\r\n\r\n&lt;!-- After: portable! --&gt;\r\n&lt;Application Id=\"App\" Executable=\"$targetnametoken$.exe\"&gt;\r\n<\/code><\/pre>\n<p>If there\u2019s a single .exe in the package folder, winapp CLI picks it up automatically. Need to be explicit? Use the <code>--executable<\/code> flag. This is a game-changer if you share a manifest across multiple build configs, IDEs, or CI environments.<\/p>\n<h2><code>\ud83d\udcaa winapp store<\/code>: Microsoft Store Developer CLI integration<\/h2>\n<p>Meet the new store subcommand! It proxies commands to the <a href=\"https:\/\/github.com\/microsoft\/msstore-cli\"><em>Microsoft Store Developer CLI<\/em><\/a> (msstore), and winapp CLI downloads and manages the binary on first use. No separate install needed.<\/p>\n<pre class=\"prettyprint language-default\"><code class=\"language-default\">winapp store &lt;command&gt; [arguments]<\/code><\/pre>\n<p>This follows the same auto-download pattern as the existing tool command. Run <code>winapp store -- --help<\/code> to see everything that\u2019s available.<\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/ifdef-windows\/wp-content\/uploads\/sites\/61\/2026\/02\/store-cli.webp\"><img decoding=\"async\" class=\"alignnone wp-image-952\" src=\"https:\/\/devblogs.microsoft.com\/ifdef-windows\/wp-content\/uploads\/sites\/61\/2026\/02\/store-cli-300x164.webp\" alt=\"store cli image\" width=\"695\" height=\"380\" srcset=\"https:\/\/devblogs.microsoft.com\/ifdef-windows\/wp-content\/uploads\/sites\/61\/2026\/02\/store-cli-300x164.webp 300w, https:\/\/devblogs.microsoft.com\/ifdef-windows\/wp-content\/uploads\/sites\/61\/2026\/02\/store-cli-768x421.webp 768w, https:\/\/devblogs.microsoft.com\/ifdef-windows\/wp-content\/uploads\/sites\/61\/2026\/02\/store-cli.webp 976w\" sizes=\"(max-width: 695px) 100vw, 695px\" \/><\/a><\/p>\n<h2 style=\"line-height: 115%;\">\ud83e\udd29 Improved help output and cleaner error messages<\/h2>\n<p>We\u2019ve revamped the <code>winapp --help<\/code> experience. Commands are now grouped into categories with short descriptions, making it way easier to find what you need at a glance. No more scrolling through a wall of flat text.<\/p>\n<p>Error messages got some love too. Previously, the tool was wrapping errors in layers of \u201cError:\u201d and \u201cFailed to X:\u201d prefixes, sometimes printing the same message twice. That\u2019s all cleaned up now: errors are printed once, without the noise, and you\u2019ll see a helpful &#8211;verbose for more details hint when something goes wrong.<\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/ifdef-windows\/wp-content\/uploads\/sites\/61\/2026\/02\/newhelp.webp\"><img decoding=\"async\" class=\"alignnone wp-image-949\" src=\"https:\/\/devblogs.microsoft.com\/ifdef-windows\/wp-content\/uploads\/sites\/61\/2026\/02\/newhelp-300x177.webp\" alt=\"newhelp image\" width=\"679\" height=\"401\" srcset=\"https:\/\/devblogs.microsoft.com\/ifdef-windows\/wp-content\/uploads\/sites\/61\/2026\/02\/newhelp-300x177.webp 300w, https:\/\/devblogs.microsoft.com\/ifdef-windows\/wp-content\/uploads\/sites\/61\/2026\/02\/newhelp-1024x604.webp 1024w, https:\/\/devblogs.microsoft.com\/ifdef-windows\/wp-content\/uploads\/sites\/61\/2026\/02\/newhelp-768x453.webp 768w, https:\/\/devblogs.microsoft.com\/ifdef-windows\/wp-content\/uploads\/sites\/61\/2026\/02\/newhelp.webp 1190w\" sizes=\"(max-width: 679px) 100vw, 679px\" \/><\/a><\/p>\n<h2>\u26a1 Other notable changes<\/h2>\n<ul>\n<li><strong>New <code>winapp create-external-catalog<\/code> command:<\/strong> Introduces a new command to create an external catalog, streamlining asset management for developers.<\/li>\n<li><strong><code>create-debug-identity --keep-identity<\/code><\/strong>: When you run create-debug-identity, winapp CLI appends .debug to your package identity so it doesn\u2019t collide with a production install. If you want to register with the exact identity from your manifest instead (for example, to match a Store-provisioned identity during development), pass &#8211;keep-identity.<\/li>\n<li><strong><code>winapp pack<\/code><\/strong><strong> no longer touches your source folder<\/strong>: The pack command used to write generated files (manifest copies, PRI files, etc.) right into your input folder. Now it uses a temporary directory, so your source stays clean.<\/li>\n<li><strong><code>winapp pack<\/code><\/strong> now properly includes all asset variants in the resources.pri file and asset discovery has been added when qualified MRT names (e.g., &#8220;Logo.scale-100.png&#8221;) are specified in the manifest. This enables proper display of unplated icons in the Windows taskbar and ensures all scaled\/themed variants are bundled even when the manifest references a specific qualified asset.<\/li>\n<li><strong>Identity name validation fix<\/strong>: Package names with underscores or spaces are now automatically sanitized to produce a valid MSIX identity ([-.A-Za-z0-9]+). No more mysterious create-debug-identity failures.<\/li>\n<li><strong><code>manifest update-assets<\/code><\/strong><strong> improvements<\/strong>: The command now updates all assets referenced in your manifest, not just the defaults.<\/li>\n<li><strong>flutter sample:<\/strong> Per popular demand, there\u2019s now a full <a href=\"https:\/\/github.com\/microsoft\/winappCli\/blob\/main\/docs\/guides\/flutter.md\"><em>Flutter guide and sample project<\/em><\/a> showing how to add Windows App SDK APIs, debug with identity, and package a Flutter Windows app with the Windows App Development CLI, from setup to MSIX.<\/li>\n<\/ul>\n<h2>\u26d3\ufe0f\u200d\ud83d\udca5 Breaking changes<\/h2>\n<p>A few things to be aware of if you\u2019re upgrading:<\/p>\n<ul>\n<li><strong>winapp init<\/strong><strong> no longer generates a certificate<\/strong>: init used to create a dev signing cert automatically. That\u2019s been removed. Run winapp cert generate explicitly when you need to sign with a dev certificate. The &#8211;no-cert flag is also gone since there\u2019s nothing to skip. If your scripts relied on init producing a cert, add a winapp cert generate step.<\/li>\n<li><strong>winapp now uses the NuGet global cache for packages:\u00a0<\/strong>when downloading NuGet packages, winapp used to store them in the <code>%userprofile%\/.winapp\/packages<\/code> folder which caused duplicate packages to be downloaded if the user already had those packages in their NuGet cache. With this release, winapp uses the NuGet global cache for all packages. If your code depends on the packages being in the global .winapp folder, you will need to update it.<\/li>\n<li><strong>.NET projects skip <\/strong><strong>winapp.yaml<\/strong>: When winapp init detects a .csproj, it configures NuGet packages in the project file directly instead of creating a winapp.yaml. This is the right behavior for .NET, but if you had a hybrid workflow, check the <a href=\"https:\/\/github.com\/microsoft\/winappCli\/blob\/main\/docs\/guides\/dotnet.md\"><em>.NET guide<\/em><\/a> for details.<\/li>\n<\/ul>\n<h2>Get started today<\/h2>\n<p>The Windows App Development CLI is available now in public preview. Visit our\u00a0<a href=\"https:\/\/github.com\/microsoft\/WinAppCli\">GitHub repository<\/a>\u00a0for documentation, guides and to file issues.<\/p>\n<p>We would love to hear your feedback!<\/p>\n<p>To get started:<\/p>\n<p><strong>Install via WinGet:<\/strong><\/p>\n<div class=\"enlighter-default enlighter-v-inline enlighter-t-classic enlighter-l-generic \">\n<pre class=\"prettyprint language-default\"><code class=\"language-default\">winget install microsoft.winappcli<\/code><\/pre>\n<p><strong>Install via npm:<\/strong><\/p>\n<\/div>\n<div class=\"enlighter-default enlighter-v-inline enlighter-t-classic enlighter-l-generic \">\n<pre class=\"prettyprint language-default\"><code class=\"language-default\">npm install --save-dev @microsoft\/winappcli<\/code><\/pre>\n<p>Check out our\u00a0<a href=\"https:\/\/github.com\/microsoft\/WinAppCli\/blob\/main\/docs\/guides\/dotnet.md\">.NET<\/a>, \u00a0<a href=\"https:\/\/github.com\/microsoft\/WinAppCli\/blob\/main\/docs\/guides\/cpp.md\">C++\/CMAKE<\/a>, <a href=\"https:\/\/github.com\/microsoft\/WinAppCli\/blob\/main\/docs\/electron-get-started.md\">Electron<\/a>, <a href=\"https:\/\/github.com\/microsoft\/WinAppCli\/blob\/main\/docs\/guides\/rust.md\">Rust<\/a> or <a href=\"https:\/\/github.com\/microsoft\/winappCli\/blob\/main\/docs\/guides\/flutter.md\">Flutter<\/a> guides for getting started quickly.<\/p>\n<\/div>\n<p>Happy coding!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Windows App Development CLI v0.2 is here! This release is driven largely by community feedback and packs in native .NET project support, manifest placeholders that eliminate hardcoded executable names, Microsoft Store Developer CLI integration, a revamped help experience, and more. Get the update by running winget install Microsoft.WinAppCLI or check the repo for other install [&hellip;]<\/p>\n","protected":false},"author":40215,"featured_media":1176,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1,71],"tags":[75,49,74,59,63,72,73,7,44],"class_list":["post-938","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ifdef-windows","category-windows-app-development-cli","tag-appxmanifest","tag-dotnet","tag-flutter","tag-microsoft-store","tag-msix","tag-winapp","tag-winappcli","tag-winui3","tag-wpf"],"acf":[],"blog_post_summary":"<p>Windows App Development CLI v0.2 is here! This release is driven largely by community feedback and packs in native .NET project support, manifest placeholders that eliminate hardcoded executable names, Microsoft Store Developer CLI integration, a revamped help experience, and more. Get the update by running winget install Microsoft.WinAppCLI or check the repo for other install [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/ifdef-windows\/wp-json\/wp\/v2\/posts\/938","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/ifdef-windows\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/ifdef-windows\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/ifdef-windows\/wp-json\/wp\/v2\/users\/40215"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/ifdef-windows\/wp-json\/wp\/v2\/comments?post=938"}],"version-history":[{"count":2,"href":"https:\/\/devblogs.microsoft.com\/ifdef-windows\/wp-json\/wp\/v2\/posts\/938\/revisions"}],"predecessor-version":[{"id":1184,"href":"https:\/\/devblogs.microsoft.com\/ifdef-windows\/wp-json\/wp\/v2\/posts\/938\/revisions\/1184"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/ifdef-windows\/wp-json\/wp\/v2\/media\/1176"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/ifdef-windows\/wp-json\/wp\/v2\/media?parent=938"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/ifdef-windows\/wp-json\/wp\/v2\/categories?post=938"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/ifdef-windows\/wp-json\/wp\/v2\/tags?post=938"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}