{"id":61,"date":"2026-05-04T09:18:54","date_gmt":"2026-05-04T16:18:54","guid":{"rendered":"https:\/\/devblogs.microsoft.com\/insidemsix\/?p=61"},"modified":"2026-05-04T09:18:54","modified_gmt":"2026-05-04T16:18:54","slug":"there-is-no-install-its-stage-and-register","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/insidemsix\/there-is-no-install-its-stage-and-register\/","title":{"rendered":"There is no Install &#8211; it&#8217;s &#8216;Stage&#8217; and &#8216;Register&#8217;"},"content":{"rendered":"<p>&#8220;Is <em>ContosoParts.msix<\/em> installed?&#8221; is a common &#8211; but misleading &#8211; question<\/p>\n<p>The term install is not a formal concept in <a href=\"https:\/\/learn.microsoft.com\/windows\/msix\/overview\">MSIX<\/a>.<\/p>\n<p>This may seem paradoxical for a deployment technology, but it makes perfect sense once you understand MSIX deployment\u2019s core architecture.<\/p>\n<h2>Deployment Requests<\/h2>\n<p>A caller makes a <strong>deployment request<\/strong> to the deployment engine via the <a href=\"https:\/\/learn.microsoft.com\/uwp\/api\/windows.management.deployment.packagemanager\">PackageManager API<\/a> to perform some activity. This may involve adding a package to the system, removing one, or performing another management operation. Deployment requests include:<\/p>\n<ul>\n<li>the requested action<\/li>\n<li>the target package<\/li>\n<li>API parameters supplied by the caller<\/li>\n<li>contextual information about the requesting user (e.g., user ID and security context)<\/li>\n<\/ul>\n<p>The system queues the request in the deployment engine\u2019s memory for processing by the <strong>deployment pipeline<\/strong>.<\/p>\n<h2>The Deployment Pipeline<\/h2>\n<p>The deployment pipeline processes requests through an ordered set of steps. The pipeline may short-circuit or skip some steps, depending on the request and system state. At its core the processing consists of three primary stages:<\/p>\n<ul>\n<li>Index<\/li>\n<li>Stage<\/li>\n<li>Register<\/li>\n<\/ul>\n<h3>Index<\/h3>\n<p>Parse the incoming package\u2019s metadata (for example, <a href=\"https:\/\/learn.microsoft.com\/uwp\/schemas\/appxpackage\/appx-package-manifest\">AppxManifest.xml<\/a>) and store that information along with system metadata such as the intended installation path.<\/p>\n<h3>Stage<\/h3>\n<p>Create the package\u2019s target installation location (also known as the <strong>package directory<\/strong>, or <em>pkgdir<\/em>).<\/p>\n<p>Acquire the package payload and extract it into the pkgdir, and apply appropriate ACLs to secure the content.<\/p>\n<h3>Register<\/h3>\n<p>Associate the staged package with a specific user profile.<\/p>\n<p>This may involve, among other actions:<\/p>\n<ul>\n<li>creating Start Menu entries<\/li>\n<li>registering file type associations<\/li>\n<li>configuring runtime data<\/li>\n<\/ul>\n<p>Registering the package effectively makes it usable for that user.<\/p>\n<h2>Per-Machine vs Per-User<\/h2>\n<p><strong>Indexing<\/strong> and <strong>Staging<\/strong> are <strong>per-machine<\/strong> activities. The system performs these once per machine.<\/p>\n<p>Staged packages are stored and shared across all users on the system, with the pkgdir secured to allow Read and Execute access \u2014 but not Write access \u2014 to users.<\/p>\n<p><strong>Registering<\/strong> is a <strong>per-user<\/strong> activity.<\/p>\n<p>This separation enables MSIX to alter the set of available packages for one user without affecting others. This isolation \u2014 and the controlled servicing it enables \u2014 is a cornerstone of MSIX\u2019s design and is reflected in many platform behaviors and APIs.<\/p>\n<h2>So\u2026 Installing?<\/h2>\n<p>To make a package available for a user for the first time, a caller might invoke an <a href=\"https:\/\/learn.microsoft.com\/uwp\/api\/windows.management.deployment.packagemanager.addpackagebyuriasync\">Add API<\/a>:<\/p>\n<pre><code class=\"csharp\">var packageUri = new Uri(\"C:\\\\Packages\\\\ContosoParts.msix\");\nvar options = new AddPackageOptions();\nvar packageManager = new PackageManager();\nvar result = await packageManager.AddPackageByUriAsync(packageUri, options);\n...\n<\/code><\/pre>\n<p>This sends an <strong>Add<\/strong> request to the deployment engine, which:<\/p>\n<ul>\n<li>Indexes the package<\/li>\n<li>Stages the package into a new pkgdir<\/li>\n<li>Registers it for the user<\/li>\n<\/ul>\n<p>At no point did we technically \u201cinstall\u201d anything.<\/p>\n<p>Even though we just installed the package \ud83d\ude42<\/p>\n","protected":false},"excerpt":{"rendered":"<p>&#8220;Is ContosoParts.msix installed?&#8221; is a common &#8211; but misleading &#8211; question The term install is not a formal concept in MSIX. This may seem paradoxical for a deployment technology, but it makes perfect sense once you understand MSIX deployment\u2019s core architecture. Deployment Requests A caller makes a deployment request to the deployment engine via the [&hellip;]<\/p>\n","protected":false},"author":911,"featured_media":81,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[8,9,3,7,2,6,5,4,10],"class_list":["post-61","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-msix","tag-architecture","tag-code","tag-deployment","tag-deploymentrequest","tag-msix","tag-packagemanager","tag-register","tag-stage","tag-terminology"],"acf":[],"blog_post_summary":"<p>&#8220;Is ContosoParts.msix installed?&#8221; is a common &#8211; but misleading &#8211; question The term install is not a formal concept in MSIX. This may seem paradoxical for a deployment technology, but it makes perfect sense once you understand MSIX deployment\u2019s core architecture. Deployment Requests A caller makes a deployment request to the deployment engine via the [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/insidemsix\/wp-json\/wp\/v2\/posts\/61","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/insidemsix\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/insidemsix\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/insidemsix\/wp-json\/wp\/v2\/users\/911"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/insidemsix\/wp-json\/wp\/v2\/comments?post=61"}],"version-history":[{"count":1,"href":"https:\/\/devblogs.microsoft.com\/insidemsix\/wp-json\/wp\/v2\/posts\/61\/revisions"}],"predecessor-version":[{"id":76,"href":"https:\/\/devblogs.microsoft.com\/insidemsix\/wp-json\/wp\/v2\/posts\/61\/revisions\/76"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/insidemsix\/wp-json\/wp\/v2\/media\/81"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/insidemsix\/wp-json\/wp\/v2\/media?parent=61"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/insidemsix\/wp-json\/wp\/v2\/categories?post=61"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/insidemsix\/wp-json\/wp\/v2\/tags?post=61"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}