Deployment Models

Deployment has two separate axes:

  • Packaging: packaged MSIX, packaged with external location, or unpackaged.
  • Runtime: framework-dependent or self-contained.
flowchart TD
    start(["Choose distribution"]) --> store{"Microsoft Store target?"}
    store -->|Yes| packaged["Packaged MSIX"]
    store -->|No| existing{"Existing installer must stay?"}
    existing -->|Yes| external["Package with external location"]
    existing -->|No| internal{"Internal or xcopy tool?"}
    internal -->|Yes| unpackaged["Unpackaged"]
    internal -->|No| packaged
    packaged --> fd["Usually framework-dependent"]
    external --> runtime["Bootstrap or deploy runtime"]
    unpackaged --> selfcontained["Prefer self-contained for direct/xcopy"]

Packaging Axis

ModelUse whenCosts
Packaged MSIXNew WinUI app, Store path, package identity featuresMSIX/package tooling and manifest discipline
Packaged with external locationExisting installer must stay but package identity is neededMore moving parts: sparse identity plus existing installer
UnpackagedInternal tools or environments where MSIX is blockedYou own runtime, updates, identity alternatives, signing, SmartScreen

Runtime Axis

ModelUse whenCosts
Framework-dependentStore/MSIX or controlled environments can install runtime dependenciesTarget machine must have the right Windows App Runtime packages
Self-containedDirect download, xcopy, CI artifact, or machines where runtime install is frictionLarger output; some APIs still depend on additional packages/services

Package Identity Features

Package identity matters for features such as notifications, startup tasks, file/protocol associations, share targets, app services, and other Windows extensibility points.

If a feature depends on package identity, do not prototype it as unpackaged without a fallback plan.

Gotcha: PublishSingleFile is only for unpackaged self-contained WinUI 3 apps in supported Windows App SDK versions. Packaged apps do not support single-file output.