{"id":380,"date":"2026-10-27T09:00:41","date_gmt":"2026-10-27T16:00:41","guid":{"rendered":"https:\/\/devblogs.microsoft.com\/insidemsix\/?p=380"},"modified":"2026-10-25T23:53:51","modified_gmt":"2026-10-26T06:53:51","slug":"msix-external-location","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/insidemsix\/msix-external-location\/","title":{"rendered":"External Location"},"content":{"rendered":"<p>We talked recently about <a href=\"https:\/\/devblogs.microsoft.com\/insidemsix\/msix-packagevolume\/\">PackageVolume<\/a> as one of the ways to stage packages.<\/p>\n<p>Let&#8217;s turn our gaze to External Location, which plays a distinct role in MSIX, with similarities to &#8211; and important differences from &#8211; other options.<\/p>\n<h2>Why is External Location?<\/h2>\n<p>MSIX deployment provides a full-service software installation stack. The process is simple: collect your content, describe your package in an <code>AppxManifest.xml<\/code>, and run makeappx.exe and signtool.exe to create a signed .msix to distribution and install.<\/p>\n<p>But&#8230;what if you already have a product with an existing installer? What if you need to extend your product with features uniquely requiring MSIX? For example, if your application needs to run with package identity to access resources requiring identity? Or you need to add <a href=\"https:\/\/learn.microsoft.com\/windows\/apps\/develop\/windows-integration\/integrate-sharesheet-receive\">Share Target<\/a> support? Or <a href=\"https:\/\/learn.microsoft.com\/windows\/msix\/packaging-tool\/support-legacy-context-menus\">File Explorer context menus in Windows 11<\/a>?<\/p>\n<p>Before External Location, this meant replacing your existing installer with an MSIX package. This can be costly for some, or simply not possible if MSIX doesn&#8217;t support all your deployment needs.<\/p>\n<p>If only an existing installer could incrementally leverage MSIX&#8230;<\/p>\n<p>And thus was born <strong>External Location<\/strong>.<\/p>\n<h2>What is External Location?<\/h2>\n<p>A package with an External Location is installed with an additional path, specified at install time. This tells Windows where to find the package\u2019s <a href=\"https:\/\/devblogs.microsoft.com\/insidemsix\/msix-footprint-vs-payload-files\/\">payload files<\/a>, separately from its install location.<\/p>\n<h3>Example without External Location<\/h3>\n<p>For example, create <code>Contoso.PointOfSale-v1.2.3.4-x64.msix<\/code> using this <code>AppxManifest.xml<\/code> fragment:<\/p>\n<pre><code class=\"xml\">&lt;?xml version=\"1.0\" encoding=\"utf-8\"?&gt;\n&lt;Package ...&gt;\n  &lt;Identity Name=\"Contoso.PointOfSale\"\n            Publisher=\"CN=Contoso LLC, O=Contoso LLC, L=Paris, C=France\"\n            Version=\"1.2.3.4\"\n            ProcessorArchitecture=\"x64\" \/&gt;\n  ...\n  &lt;Applications&gt;\n    &lt;Application ... Executable=\"PointOfSale.exe\"&gt;\n...\n&lt;\/Package&gt;    \n<\/code><\/pre>\n<p>Now <a href=\"https:\/\/devblogs.microsoft.com\/insidemsix\/there-is-no-install-its-stage-and-register\/\">install<\/a> the package, e.g.<\/p>\n<pre><code class=\"powershell\">Add-AppxPackage C:\\Packages\\Downloads\\Contoso.PointOfSale-v1.2.3.4-x64.msix\n<\/code><\/pre>\n<p>As a result, Windows stages the package at <code>C:\\Program Files\\WindowsApps\\Contoso.PointOfSale_1.2.3.4_x64__eh4htm4n7tdre<\/code>, containing <code>AppxManifest.xml<\/code>, <code>PointOfSale.exe<\/code> and the rest of the package&#8217;s contents.<\/p>\n<p>Windows launches <code>C:\\Program Files\\WindowsApps\\Contoso.PointOfSale_1.2.3.4_x64__eh4htm4n7tdre\\PointOfSale.exe<\/code> when you activate the app.<\/p>\n<h3>Example with External Location<\/h3>\n<p>Installing a package with an External Location requires adding <a href=\"https:\/\/learn.microsoft.com\/en-us\/uwp\/schemas\/appxpackage\/uapmanifestschema\/element-uap10-allowexternalcontent\"><uap10:AllowExternalContent><\/a> to <code>AppxManifest.xml<\/code>:<\/p>\n<pre><code class=\"xml\">&lt;?xml version=\"1.0\" encoding=\"utf-8\"?&gt;\n&lt;Package ...&gt;\n  &lt;Identity Name=\"Contoso.Invoice\"\n            Publisher=\"CN=Contoso LLC, O=Contoso LLC, L=Paris, C=France\"\n            Version=\"4.1.2023.0\"\n            ProcessorArchitecture=\"x64\" \/&gt;\n  &lt;Properties&gt;\n    ...\n    &lt;uap10:AllowExternalContent&gt;true&lt;\/uap10:AllowExternalContent&gt;\n  &lt;\/Properties&gt;\n  ...\n  &lt;Applications&gt;\n    &lt;Application ... Executable=\"Invoice.exe\"&gt;\n...\n&lt;\/Package&gt;    \n<\/code><\/pre>\n<p>and an additional path, specified at install time.<\/p>\n<p>Assume your existing installer has placed <code>Invoice.exe<\/code> and its supporting files in <code>D:\\MyApps\\Contoso<\/code>.<\/p>\n<pre><code class=\"powershell\">Add-AppxPackage C:\\Packages\\Downloads\\Contoso.Invoice-v4.1.2023.0-x64.msix -ExternalLocation D:\\MyApps\\Contoso\n<\/code><\/pre>\n<p>As a result, Windows stages the package at <code>C:\\Program Files\\WindowsApps\\Contoso.Invoice_4.1.2023.0_x64__eh4htm4n7tdre<\/code>, containing the package&#8217;s contents.<\/p>\n<p>But&#8230;at runtime, activation uses <code>D:\\MyApps\\Contoso\\Invoice.exe<\/code>.<\/p>\n<h2>Location, Location, Location<\/h2>\n<p>A package always has an <strong>Install<\/strong> location. This is <code>C:\\Program Files\\WindowsApps\\Contoso.Invoice_4.1.2023.0_x64__eh4htm4n7tdre<\/code> in the Invoice example above.<\/p>\n<p>A package may also have a per-machine <strong>External Location<\/strong>. This is commonly referred to as the <strong>Machine External Location<\/strong>.<\/p>\n<p>Also.<\/p>\n<p>The External Location doesn&#8217;t replace the install location. Instead, it supplements it.<\/p>\n<p>P.S. A package may also have a per-user External Location, but this is rarer and has its own story and nuances. We&#8217;ll discuss this in a future post. For now, assume &#8220;External Location&#8221; mentioned in this post always means a Machine External Location.<\/p>\n<h2>What External Location does<\/h2>\n<p>A package&#8217;s External Location tells Windows where to find the package&#8217;s <strong>payload<\/strong> files.<\/p>\n<p>Windows still expects <code>AppxManifest.xml<\/code>, <code>AppxBlockMap.xml<\/code> and other <a href=\"https:\/\/devblogs.microsoft.com\/insidemsix\/msix-footprint-vs-payload-files\/\">Footprint files<\/a> in the package&#8217;s install location, e.g. <code>C:\\Program Files\\WindowsApps\\Contoso.Invoice_4.1.2023.0_x64__eh4htm4n7tdre\\AppxManifest.xml<\/code>.<\/p>\n<p>Windows normally looks for files referenced in <code>AppxManifest.xml<\/code> at the package&#8217;s install location. The magic of External Location is to tell Windows <em>somewhere else<\/em> to look for those files:<\/p>\n<ul>\n<li><code>&lt;Application Executable=\"Invoice.exe\" ...&gt;<\/code><\/li>\n<li><code>&lt;uap:VisualElements Square44x44Logo=\"bill.png\"&gt;<\/code><\/li>\n<li><code>&lt;desktop10:DataShortcut File=\"README.txt\" ...&gt;<\/code><\/li>\n<li>&#8230;<\/li>\n<\/ul>\n<p>This makes for more of a &#8220;Rent, not Buy&#8221; scenario. MSIX doesn&#8217;t install or manage those files. MSIX doesn&#8217;t own them. MSIX isn&#8217;t responsible for repairing them. Securing them. Uninstalling them. MSIX merely knows where to find them. Someone else creates, deletes and manages them.<\/p>\n<p>An MSIX package with an External Location <em>supplements<\/em> some other installer.<\/p>\n<p>That&#8217;s why this is sometimes informally referred to as a &#8220;Bring Your Own Installer&#8221; model.<\/p>\n<h2>Not Allowed but Required<\/h2>\n<p><code>&lt;uap10:AllowExternalContent&gt;true&lt;\/uap10:AllowExternalContent&gt;<\/code> <strong>MUST<\/strong> be declared in <code>AppxManifest.xml<\/code> to install a package with an External Location.<\/p>\n<p>In addition, a package <strong>MUST<\/strong> be installed with an External Location if its manifest sets <code>&lt;uap10:AllowExternalContent&gt;true&lt;\/uap10:AllowExternalContent&gt;<\/code>.<\/p>\n<p>The name is a misnomer. It should have been <code>RequireExternalContent<\/code>.<\/p>\n<p>Another task for when that time machine finally works&#8230;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>We talked recently about PackageVolume as one of the ways to stage packages. Let&#8217;s turn our gaze to External Location, which plays a distinct role in MSIX, with similarities to &#8211; and important differences from &#8211; other options. Why is External Location? MSIX deployment provides a full-service software installation stack. The process is simple: collect [&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,2,10],"class_list":["post-380","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-msix","tag-architecture","tag-code","tag-deployment","tag-msix","tag-terminology"],"acf":[],"blog_post_summary":"<p>We talked recently about PackageVolume as one of the ways to stage packages. Let&#8217;s turn our gaze to External Location, which plays a distinct role in MSIX, with similarities to &#8211; and important differences from &#8211; other options. Why is External Location? MSIX deployment provides a full-service software installation stack. The process is simple: collect [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/insidemsix\/wp-json\/wp\/v2\/posts\/380","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=380"}],"version-history":[{"count":1,"href":"https:\/\/devblogs.microsoft.com\/insidemsix\/wp-json\/wp\/v2\/posts\/380\/revisions"}],"predecessor-version":[{"id":392,"href":"https:\/\/devblogs.microsoft.com\/insidemsix\/wp-json\/wp\/v2\/posts\/380\/revisions\/392"}],"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=380"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/insidemsix\/wp-json\/wp\/v2\/categories?post=380"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/insidemsix\/wp-json\/wp\/v2\/tags?post=380"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}