dotnet-msix
MSIX packaging pipeline for .NET desktop applications: package creation from csproj (WindowsPackageType) and WAP
projects, certificate signing (self-signed for development, trusted CA for production, Microsoft Store signing),
distribution channels (Microsoft Store submission, App Installer sideloading, enterprise deployment via SCCM/Intune),
auto-update configuration (App Installer XML, version checking, differential updates), MSIX bundle format for
multi-architecture (.msixbundle), and CI/CD MSIX build steps.
Version assumptions: Windows App SDK 1.6+ (current stable). Windows 10 build 19041+ minimum for MSIX with Windows
App SDK. Windows 10 build 1709+ for App Installer auto-update protocol. .NET 8.0+ baseline.
Scope
- Package creation from csproj and WAP projects
- Certificate signing (self-signed, trusted CA, Store signing)
- Microsoft Store submission workflow
- App Installer sideloading and auto-update configuration
- MSIX bundle format for multi-architecture
- CI/CD MSIX build steps
Out of scope
- WinUI 3 project setup and MSIX vs unpackaged comparison -- see [skill:dotnet-winui]
- Native AOT MSBuild configuration -- see [skill:dotnet-native-aot]
- General CI/CD pipeline patterns -- see [skill:dotnet-gha-patterns] and [skill:dotnet-ado-patterns]
- General NuGet packaging -- see [skill:dotnet-nuget-authoring]
- Container-based deployment -- see [skill:dotnet-containers]
Cross-references: [skill:dotnet-winui] for WinUI project setup and packaging mode comparison, [skill:dotnet-native-aot]
for AOT + MSIX scenarios, [skill:dotnet-gha-patterns] for CI pipeline structure, [skill:dotnet-ado-patterns] for ADO
pipeline structure, [skill:dotnet-nuget-authoring] for NuGet packaging.
MSIX Package Creation
From csproj (Single-Project Packaging)
Modern WinUI 3 and Windows App SDK apps can produce MSIX packages directly from the application .csproj without a
separate Windows Application Packaging (WAP) project.
<!-- MyApp.csproj -->
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net8.0-windows10.0.19041.0</TargetFramework>
<UseWinUI>true</UseWinUI>
<!-- MSIX packaging mode -->
<WindowsPackageType>MSIX</WindowsPackageType>
<!-- Package identity -->
<AppxPackageDir>$(SolutionDir)AppPackages\</AppxPackageDir>
<GenerateAppxPackageOnBuild>false</GenerateAppxPackageOnBuild>
</PropertyGroup>
</Project>
```text
Build the MSIX package:
```bash
# Build MSIX package
dotnet publish --configuration Release --runtime win-x64 \
/p:GenerateAppxPackageOnBuild=true \
/p:AppxPackageSigningEnabled=false
# Output: AppPackages\MyApp_1.0.0.0_x64.msix
```text
### WAP Project (Desktop Bridge)
For non-WinUI desktop apps (WPF, WinForms), use a Windows Application Packaging Project to wrap the existing app as MSIX. WAP projects (`.wapproj`) are created via the Visual Studio "Windows Application Packaging Project" template -- they use a specialized project format, not the standard `Microsoft.NET.Sdk`.
The key configuration is referencing the desktop app project:
```xml
<!-- MyApp.Package.wapproj (created via VS template) -->
<!-- Key elements in the generated .wapproj file: -->
<ItemGroup>
<!-- Reference the desktop app project to include in MSIX -->
<ProjectReference Include="..\MyWpfApp\MyWpfApp.csproj" />
</ItemGroup>
<!-- Set target platform versions in the .wapproj PropertyGroup -->
<PropertyGroup>
<TargetPlatformVersion>10.0.22621.0</TargetPlatformVersion>
<TargetPlatformMinVersion>10.0.19041.0</TargetPlatformMinVersion>
<DefaultLanguage>en-US</DefaultLanguage>
<AppxPackageDir>$(SolutionDir)AppPackages\</AppxPackageDir>
</PropertyGroup>
```text
### Package.appxmanifest
The manifest defines identity, capabilities, and visual assets:
```xml
<?xml version="1.0" encoding="utf-8"?>
<Package xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
IgnorableNamespaces="uap rescap">
<Identity Name="MyCompany.MyApp"
Publisher="CN=My Company, O=My Company, L=Seattle, S=WA, C=US"
Version="1.0.0.0"
ProcessorArchitecture="x64" />
<Properties>
<DisplayName>My App</DisplayName>
<PublisherDisplayName>My Company</PublisherDisplayName>
<Logo>Assets\StoreLogo.png</Logo>
</Properties>
<Dependencies>
<TargetDeviceFamily Name="Windows.Desktop"
MinVersion="10.0.19041.0"
MaxVersionTested="10.0.22621.0" />
</Dependencies>
<Resources>
<Resource Language="en-us" />
</Resources>
<Applications>
<Application Id="App"
Executable="MyApp.exe"
EntryPoint="$targetentrypoint$">
<uap:VisualElements DisplayName="My App"
Description="My application description"
BackgroundColor="transparent"
Square150x150Logo="Assets\Square150x150Logo.png"
Square44x44Logo="Assets\Square44x44Logo.png">
<uap:DefaultTile Wide310x150Logo="Assets\Wide310x150Logo.png" />
</uap:VisualElements>
</Application>
</Applications>
<Capabilities>
<Capability Name="internetClient" />
<rescap:Capability Name="runFullTrust" />
</Capabilities>
</Package>
```text
---
## Signing with Certificates
All MSIX packages must be signed to install on Windows. The signing certificate's Subject must match the `Publisher` attribute in the package manifest.
### Self-Signed Certificate (Development)
```powershell
# Create a self-signed certificate for development
$cert = New-SelfSignedCertificate `
-Type Custom `
-Subject "CN=My Company, O=My Company, L=Seattle, S=WA, C=US" `
-KeyUsage DigitalSignature `
-FriendlyName "MyApp Dev Signing" `
-CertStoreLocation "Cert:\CurrentUser\My" `
-TextExtension @("2.5.29.37={text}1.3.6.1.5.5.7.3.3", `
"2.5.29.19={text}")
# Export PFX for CI usage
$password = ConvertTo-SecureString -String "$env:CERT_PASSWORD" -Force -AsPlainText
Export-PfxCertificate -Cert $cert `
-FilePath "MyApp_DevSigning.pfx" `
-Password $password
# Find signtool.exe dynamically (SDK version varies by machine)
$signtool = Get-ChildItem "C:\Program Files (x86)\Windows Kits\10\bin\*\x64\signtool.exe" |
Sort-Object { [version]($_.Directory.Parent.Name) } -Descending |
Select-Object -First 1 -ExpandProperty FullName
# Sign the MSIX package
& $signtool sign /fd SHA256 /a /f "MyApp_DevSigning.pfx" `
/p "$env:CERT_PASSWORD" `
"AppPackages\MyApp_1.0.0.0_x64.msix"
```text
### Trusted CA Certificate (Production)
For production distribution outside the Microsoft Store:
1. **Obtain a code signing certificate** from a trusted CA (DigiCert, Sectigo, GlobalSign)
2. **Subject must match** the `Publisher` in `Package.appxmanifest`
3. **Timestamp the signature** for long-term validity
```powershell
# Sign with a trusted CA certificate (from certificate store)
& signtool.exe sign /fd SHA256 /sha1 "THUMBPRINT_HERE" `
/tr http://timestamp.digicert.com /td SHA256 `
"AppPackages\MyApp_1.0.0.0_x64.msix"
# Sign with a PFX file
& signtool.exe sign /fd SHA256 /f "production-cert.pfx" `
/p "$env:CERT_PASSWORD" `
/tr http://timestamp.digicert.com /td SHA256 `
"AppPackages\MyApp_1.0.0.0_x64.msix"
```text
### Microsoft Store Signing
Apps submitted to the Microsoft Store are re-signed by Microsoft during ingestion. The development signing certificate is replaced with a Microsoft-issued certificate. No production signing certificate is needed for Store-only distribution.
```xml
<!-- For Store submission, use a test certificate during development -->
<PropertyGroup>
<AppxPackageSigningEnabled>true</AppxPackageSigningEnabled>
<PackageCertificateThumbprint>AUTO_GENERATED_BY_VS</PackageCertificateThumbprint>
</PropertyGroup>
```text
### Certificate Requirements Summary
| Distribution | Certificate Type | Trusted CA Required |
|-------------|-----------------|---------------------|
| Development/testing | Self-signed | No (install cert manually) |
| Enterprise sideload | Self-signed or internal CA | No (deploy cert via Group Policy) |
| Direct download | Trusted CA (DigiCert, etc.) | Yes |
| Microsoft Store | Test cert (re-signed by MS) | No |
---
## Distribution Channels
### Microsoft Store Submission
1. **Register as a Windows developer** at the Partner Center (https://partner.microsoft.com/dashboard)
2. **Create an app reservation** to secure the app name
3. **Build the MSIX package** with Store association:
```bash
# Build for Store submission (creates .msixupload)
dotnet publish --configuration Release --runtime win-x64 \
/p:GenerateAppxPackageOnBuild=true \
/p:UapAppxPackageBuildMode=StoreUpload \
/p:AppxBundle=Auto
```text
1. **Submit the `.msixupload` file** through Partner Center
2. Microsoft validates, signs, and publishes the app
### App Installer Sideloading
App Installer (`.appinstaller`) enables direct distribution with auto-update support. Host the files on a web server, network share, or CDN.
```xml
<!-- MyApp.appinstaller -->
<?xml version="1.0" encoding="utf-8"?>
<AppInstaller Uri="https://mycompany.com/apps/MyApp.appinstaller"
Version="1.0.0.0"
xmlns="http://schemas.microsoft.com/appx/appinstaller/2021">
<MainPackage Name="MyCompany.MyApp"
Version="1.0.0.0"
Publisher="CN=My Company, O=My Company, L=Seattle, S=WA, C=US"
ProcessorArchitecture="x64"
Uri="https://mycompany.com/apps/MyApp_1.0.0.0_x64.msix" />
<UpdateSettings>
<OnLaunch HoursBetweenUpdateChecks="12"
ShowPrompt="true"
UpdateBlocksActivation="false" />
<AutomaticBackgroundTask />
<ForceUpdateFromAnyVersion>false</ForceUpdateFromAnyVersion>
</UpdateSettings>
</AppInstaller>
```text
Users install via:
```text
ms-appinstaller:?source=https://mycompany.com/apps/MyApp.appinstaller
```text
### Enterprise Deployment
For managed enterprise environments:
| Method | Tool | Best For |
|--------|------|----------|
| Microsoft Intune | Intune portal | Cloud-managed devices |
| SCCM/MECM | Configuration Manager | On-premises managed devices |
| Group Policy | DISM / PowerShell | Domain-joined devices |
| PowerShell | `Add-AppxPackage` | Script-based deployment |
```powershell
# Enterprise deployment via PowerShell
Add-AppxPackage -Path "\\fileserver\apps\MyApp_1.0.0.0_x64.msix"
# Install for all users (requires admin)
Add-AppxProvisionedPackage -Online `
-PackagePath "MyApp_1.0.0.0_x64.msix" `
-SkipLicense
```text
---
## Auto-Update Configuration
### App Installer Auto-Update (Windows 10 1709+)
The App Installer XML file controls automatic update behavior:
```xml
<UpdateSettings>
<!-- Check for updates on app launch -->
<OnLaunch HoursBetweenUpdateChecks="12"
ShowPrompt="true"
UpdateBlocksActivation="false" />
<!-- Background update check (Windows 10 1803+) -->
<AutomaticBackgroundTask />
<!-- Allow downgrade (useful for rollback scenarios) -->
<ForceUpdateFromAnyVersion>false</ForceUpdateFromAnyVersion>
</UpdateSettings>
```text
| Setting | Description |
|---------|-------------|
| `HoursBetweenUpdateChecks` | Minimum hours between update checks (0 = every launch) |
| `ShowPrompt` | Show update dialog to user before updating |
| `UpdateBlocksActivation` | Block app launch until update completes |
| `AutomaticBackgroundTask` | Check for updates in background without launching |
| `ForceUpdateFromAnyVersion` | Allow updating from any version (including downgrades) |
### Programmatic Update Check (Windows App SDK)
For apps that need custom update UI or logic, use `Package.Current.CheckUpdateAvailabilityAsync()`:
```csharp
using Windows.ApplicationModel;
public class AppUpdateService
{
public async Task<bool> CheckForUpdatesAsync()
{
var result = await Package.Current.CheckUpdateAvailabilityAsync();
return result.Availability == PackageUpdateAvailability.Available
|| result.Availability == PackageUpdateAvailability.Required;
}
}
```text
### Differential Updates
MSIX supports differential updates -- only changed blocks are downloaded. This is automatic when:
- The same `PackageName` and `Publisher` are used
## Detailed Examples
See [references/detailed-examples.md](references/detailed-examples.md) for complete code samples and advanced patterns.
1---2name: dotnet-msix3category: developer-experience4subcategory: cli5description: Packages MSIX apps. Creation, signing, Store submission, App Installer sideload, auto-update.6license: MIT7targets: ['*']8tags: [foundation, dotnet, skill]9version: '0.0.1'10author: 'dotnet-agent-harness'11invocable: true12claudecode:13 allowed-tools: ['Read', 'Grep', 'Glob', 'Bash', 'Write', 'Edit']14codexcli:15 short-description: '.NET skill guidance for foundation tasks'16opencode:17 allowed-tools: ['Read', 'Grep', 'Glob', 'Bash', 'Write', 'Edit']18copilot: {}19geminicli: {}20antigravity: {}21---2223# dotnet-msix2425MSIX packaging pipeline for .NET desktop applications: package creation from csproj (`WindowsPackageType`) and WAP26projects, certificate signing (self-signed for development, trusted CA for production, Microsoft Store signing),27distribution channels (Microsoft Store submission, App Installer sideloading, enterprise deployment via SCCM/Intune),28auto-update configuration (App Installer XML, version checking, differential updates), MSIX bundle format for29multi-architecture (`.msixbundle`), and CI/CD MSIX build steps.3031**Version assumptions:** Windows App SDK 1.6+ (current stable). Windows 10 build 19041+ minimum for MSIX with Windows32App SDK. Windows 10 build 1709+ for App Installer auto-update protocol. .NET 8.0+ baseline.3334## Scope3536- Package creation from csproj and WAP projects37- Certificate signing (self-signed, trusted CA, Store signing)38- Microsoft Store submission workflow39- App Installer sideloading and auto-update configuration40- MSIX bundle format for multi-architecture41- CI/CD MSIX build steps4243## Out of scope4445- WinUI 3 project setup and MSIX vs unpackaged comparison -- see [skill:dotnet-winui]46- Native AOT MSBuild configuration -- see [skill:dotnet-native-aot]47- General CI/CD pipeline patterns -- see [skill:dotnet-gha-patterns] and [skill:dotnet-ado-patterns]48- General NuGet packaging -- see [skill:dotnet-nuget-authoring]49- Container-based deployment -- see [skill:dotnet-containers]5051Cross-references: [skill:dotnet-winui] for WinUI project setup and packaging mode comparison, [skill:dotnet-native-aot]52for AOT + MSIX scenarios, [skill:dotnet-gha-patterns] for CI pipeline structure, [skill:dotnet-ado-patterns] for ADO53pipeline structure, [skill:dotnet-nuget-authoring] for NuGet packaging.5455---5657## MSIX Package Creation5859### From csproj (Single-Project Packaging)6061Modern WinUI 3 and Windows App SDK apps can produce MSIX packages directly from the application `.csproj` without a62separate Windows Application Packaging (WAP) project.6364````xml6566<!-- MyApp.csproj -->67<Project Sdk="Microsoft.NET.Sdk">68 <PropertyGroup>69 <OutputType>WinExe</OutputType>70 <TargetFramework>net8.0-windows10.0.19041.0</TargetFramework>71 <UseWinUI>true</UseWinUI>7273 <!-- MSIX packaging mode -->74 <WindowsPackageType>MSIX</WindowsPackageType>7576 <!-- Package identity -->77 <AppxPackageDir>$(SolutionDir)AppPackages\</AppxPackageDir>78 <GenerateAppxPackageOnBuild>false</GenerateAppxPackageOnBuild>79 </PropertyGroup>80</Project>8182```text8384Build the MSIX package:8586```bash8788# Build MSIX package89dotnet publish --configuration Release --runtime win-x64 \90 /p:GenerateAppxPackageOnBuild=true \91 /p:AppxPackageSigningEnabled=false9293# Output: AppPackages\MyApp_1.0.0.0_x64.msix9495```text9697### WAP Project (Desktop Bridge)9899For non-WinUI desktop apps (WPF, WinForms), use a Windows Application Packaging Project to wrap the existing app as MSIX. WAP projects (`.wapproj`) are created via the Visual Studio "Windows Application Packaging Project" template -- they use a specialized project format, not the standard `Microsoft.NET.Sdk`.100101The key configuration is referencing the desktop app project:102103```xml104105<!-- MyApp.Package.wapproj (created via VS template) -->106<!-- Key elements in the generated .wapproj file: -->107<ItemGroup>108 <!-- Reference the desktop app project to include in MSIX -->109 <ProjectReference Include="..\MyWpfApp\MyWpfApp.csproj" />110</ItemGroup>111112<!-- Set target platform versions in the .wapproj PropertyGroup -->113<PropertyGroup>114 <TargetPlatformVersion>10.0.22621.0</TargetPlatformVersion>115 <TargetPlatformMinVersion>10.0.19041.0</TargetPlatformMinVersion>116 <DefaultLanguage>en-US</DefaultLanguage>117 <AppxPackageDir>$(SolutionDir)AppPackages\</AppxPackageDir>118</PropertyGroup>119120```text121122### Package.appxmanifest123124The manifest defines identity, capabilities, and visual assets:125126```xml127128<?xml version="1.0" encoding="utf-8"?>129<Package xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"130 xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"131 xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"132 IgnorableNamespaces="uap rescap">133134 <Identity Name="MyCompany.MyApp"135 Publisher="CN=My Company, O=My Company, L=Seattle, S=WA, C=US"136 Version="1.0.0.0"137 ProcessorArchitecture="x64" />138139 <Properties>140 <DisplayName>My App</DisplayName>141 <PublisherDisplayName>My Company</PublisherDisplayName>142 <Logo>Assets\StoreLogo.png</Logo>143 </Properties>144145 <Dependencies>146 <TargetDeviceFamily Name="Windows.Desktop"147 MinVersion="10.0.19041.0"148 MaxVersionTested="10.0.22621.0" />149 </Dependencies>150151 <Resources>152 <Resource Language="en-us" />153 </Resources>154155 <Applications>156 <Application Id="App"157 Executable="MyApp.exe"158 EntryPoint="$targetentrypoint$">159 <uap:VisualElements DisplayName="My App"160 Description="My application description"161 BackgroundColor="transparent"162 Square150x150Logo="Assets\Square150x150Logo.png"163 Square44x44Logo="Assets\Square44x44Logo.png">164 <uap:DefaultTile Wide310x150Logo="Assets\Wide310x150Logo.png" />165 </uap:VisualElements>166 </Application>167 </Applications>168169 <Capabilities>170 <Capability Name="internetClient" />171 <rescap:Capability Name="runFullTrust" />172 </Capabilities>173</Package>174175```text176177---178179## Signing with Certificates180181All MSIX packages must be signed to install on Windows. The signing certificate's Subject must match the `Publisher` attribute in the package manifest.182183### Self-Signed Certificate (Development)184185```powershell186187# Create a self-signed certificate for development188$cert = New-SelfSignedCertificate `189 -Type Custom `190 -Subject "CN=My Company, O=My Company, L=Seattle, S=WA, C=US" `191 -KeyUsage DigitalSignature `192 -FriendlyName "MyApp Dev Signing" `193 -CertStoreLocation "Cert:\CurrentUser\My" `194 -TextExtension @("2.5.29.37={text}1.3.6.1.5.5.7.3.3", `195 "2.5.29.19={text}")196197# Export PFX for CI usage198$password = ConvertTo-SecureString -String "$env:CERT_PASSWORD" -Force -AsPlainText199Export-PfxCertificate -Cert $cert `200 -FilePath "MyApp_DevSigning.pfx" `201 -Password $password202203# Find signtool.exe dynamically (SDK version varies by machine)204$signtool = Get-ChildItem "C:\Program Files (x86)\Windows Kits\10\bin\*\x64\signtool.exe" |205 Sort-Object { [version]($_.Directory.Parent.Name) } -Descending |206 Select-Object -First 1 -ExpandProperty FullName207208# Sign the MSIX package209& $signtool sign /fd SHA256 /a /f "MyApp_DevSigning.pfx" `210 /p "$env:CERT_PASSWORD" `211 "AppPackages\MyApp_1.0.0.0_x64.msix"212213```text214215### Trusted CA Certificate (Production)216217For production distribution outside the Microsoft Store:2182191. **Obtain a code signing certificate** from a trusted CA (DigiCert, Sectigo, GlobalSign)2202. **Subject must match** the `Publisher` in `Package.appxmanifest`2213. **Timestamp the signature** for long-term validity222223```powershell224225# Sign with a trusted CA certificate (from certificate store)226& signtool.exe sign /fd SHA256 /sha1 "THUMBPRINT_HERE" `227 /tr http://timestamp.digicert.com /td SHA256 `228 "AppPackages\MyApp_1.0.0.0_x64.msix"229230# Sign with a PFX file231& signtool.exe sign /fd SHA256 /f "production-cert.pfx" `232 /p "$env:CERT_PASSWORD" `233 /tr http://timestamp.digicert.com /td SHA256 `234 "AppPackages\MyApp_1.0.0.0_x64.msix"235236```text237238### Microsoft Store Signing239240Apps submitted to the Microsoft Store are re-signed by Microsoft during ingestion. The development signing certificate is replaced with a Microsoft-issued certificate. No production signing certificate is needed for Store-only distribution.241242```xml243244<!-- For Store submission, use a test certificate during development -->245<PropertyGroup>246 <AppxPackageSigningEnabled>true</AppxPackageSigningEnabled>247 <PackageCertificateThumbprint>AUTO_GENERATED_BY_VS</PackageCertificateThumbprint>248</PropertyGroup>249250```text251252### Certificate Requirements Summary253254| Distribution | Certificate Type | Trusted CA Required |255|-------------|-----------------|---------------------|256| Development/testing | Self-signed | No (install cert manually) |257| Enterprise sideload | Self-signed or internal CA | No (deploy cert via Group Policy) |258| Direct download | Trusted CA (DigiCert, etc.) | Yes |259| Microsoft Store | Test cert (re-signed by MS) | No |260261---262263## Distribution Channels264265### Microsoft Store Submission2662671. **Register as a Windows developer** at the Partner Center (https://partner.microsoft.com/dashboard)2682. **Create an app reservation** to secure the app name2693. **Build the MSIX package** with Store association:270271```bash272273# Build for Store submission (creates .msixupload)274dotnet publish --configuration Release --runtime win-x64 \275 /p:GenerateAppxPackageOnBuild=true \276 /p:UapAppxPackageBuildMode=StoreUpload \277 /p:AppxBundle=Auto278279```text2802811. **Submit the `.msixupload` file** through Partner Center2822. Microsoft validates, signs, and publishes the app283284### App Installer Sideloading285286App Installer (`.appinstaller`) enables direct distribution with auto-update support. Host the files on a web server, network share, or CDN.287288```xml289290<!-- MyApp.appinstaller -->291<?xml version="1.0" encoding="utf-8"?>292<AppInstaller Uri="https://mycompany.com/apps/MyApp.appinstaller"293 Version="1.0.0.0"294 xmlns="http://schemas.microsoft.com/appx/appinstaller/2021">295296 <MainPackage Name="MyCompany.MyApp"297 Version="1.0.0.0"298 Publisher="CN=My Company, O=My Company, L=Seattle, S=WA, C=US"299 ProcessorArchitecture="x64"300 Uri="https://mycompany.com/apps/MyApp_1.0.0.0_x64.msix" />301302 <UpdateSettings>303 <OnLaunch HoursBetweenUpdateChecks="12"304 ShowPrompt="true"305 UpdateBlocksActivation="false" />306 <AutomaticBackgroundTask />307 <ForceUpdateFromAnyVersion>false</ForceUpdateFromAnyVersion>308 </UpdateSettings>309</AppInstaller>310311```text312313Users install via:314315```text316317ms-appinstaller:?source=https://mycompany.com/apps/MyApp.appinstaller318319```text320321### Enterprise Deployment322323For managed enterprise environments:324325| Method | Tool | Best For |326|--------|------|----------|327| Microsoft Intune | Intune portal | Cloud-managed devices |328| SCCM/MECM | Configuration Manager | On-premises managed devices |329| Group Policy | DISM / PowerShell | Domain-joined devices |330| PowerShell | `Add-AppxPackage` | Script-based deployment |331332```powershell333334# Enterprise deployment via PowerShell335Add-AppxPackage -Path "\\fileserver\apps\MyApp_1.0.0.0_x64.msix"336337# Install for all users (requires admin)338Add-AppxProvisionedPackage -Online `339 -PackagePath "MyApp_1.0.0.0_x64.msix" `340 -SkipLicense341342```text343344---345346## Auto-Update Configuration347348### App Installer Auto-Update (Windows 10 1709+)349350The App Installer XML file controls automatic update behavior:351352```xml353354<UpdateSettings>355 <!-- Check for updates on app launch -->356 <OnLaunch HoursBetweenUpdateChecks="12"357 ShowPrompt="true"358 UpdateBlocksActivation="false" />359360 <!-- Background update check (Windows 10 1803+) -->361 <AutomaticBackgroundTask />362363 <!-- Allow downgrade (useful for rollback scenarios) -->364 <ForceUpdateFromAnyVersion>false</ForceUpdateFromAnyVersion>365</UpdateSettings>366367```text368369| Setting | Description |370|---------|-------------|371| `HoursBetweenUpdateChecks` | Minimum hours between update checks (0 = every launch) |372| `ShowPrompt` | Show update dialog to user before updating |373| `UpdateBlocksActivation` | Block app launch until update completes |374| `AutomaticBackgroundTask` | Check for updates in background without launching |375| `ForceUpdateFromAnyVersion` | Allow updating from any version (including downgrades) |376377### Programmatic Update Check (Windows App SDK)378379For apps that need custom update UI or logic, use `Package.Current.CheckUpdateAvailabilityAsync()`:380381```csharp382383using Windows.ApplicationModel;384385public class AppUpdateService386{387 public async Task<bool> CheckForUpdatesAsync()388 {389 var result = await Package.Current.CheckUpdateAvailabilityAsync();390 return result.Availability == PackageUpdateAvailability.Available391 || result.Availability == PackageUpdateAvailability.Required;392 }393}394395```text396397### Differential Updates398399MSIX supports differential updates -- only changed blocks are downloaded. This is automatic when:400- The same `PackageName` and `Publisher` are used401402## Detailed Examples403404See [references/detailed-examples.md](references/detailed-examples.md) for complete code samples and advanced patterns.