Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
142 changes: 89 additions & 53 deletions specs/Deployment/MSIXPackageVersioning.md
Original file line number Diff line number Diff line change
Expand Up @@ -255,17 +255,10 @@ version 89 and 92+ are under development.
* Compatible with MSIX
* Does not align with common practices and expectations across the industry

***Recommendation:*** Option B.

Option B provides a stronger degree of compatibility and risk management than Option A (Major
version) while still affording a reasonable way for developers to adopt updates.

Windows App SDK aspires to adopt Option A (Major version) but more tooling and infrastructure is
desired before making that level of guarantee. Option B provides a good balance of rapid
development and compatibility assurance.

Option A can (and will) be adopted in a future release (no sooner than 2.0) once tooling and
infrastructure are ready to embrace it.
***Recommendation:***
For all 1.x, option B was selected, while waiting on tooling to be able to handle the rapid development we want.
Starting 2.x, option A is selected. This will allow for better stability for external developers. They will
know that as long as they are on the same Major, then things should be compatible.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good. I would consider writing here then things will be compatible, instead of then things should be compatible, as it should really be the exception if something on the same Major is not compatible. Of course, if there are exceptions, someone can pin-point to this. But anyway, the "should be" sounds to me like soft target. If it's really a serious goal of making the Major the incompatibility boundary, then I would make the wording here also a bit stronger.


### 2.2.1. Current practices in Microsoft-authored Framework packges.

Expand All @@ -289,8 +282,10 @@ Windows App SDK 0.5 adds a "-preview" tag to the package Name.

Windows App SDK 1.x adds a -channel# tag (e.g. "-preview1") to the package name.

***Do we need a shorter tag?*** "-preview1" adds 9 characters to package Name. "-experiental1" adds
13 characters. Package Name is restricted to 50 characters maximum.
Windows App SDK 2.x goes back to just a "-preview" tag on the package Name.

***Do we need a shorter tag?*** "-preview" adds 8 characters to package Name. "-experiental" adds
12 characters. Package Name is restricted to 50 characters maximum.

**Option A: `-preview`**
Comment on lines +285 to 290
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In a spec why are the discussion topics and options? Shouldn't the spec instead be "this is what we're doing" ? I feel like it makes the spec confusing and not clear

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree, in my opinion, this question should be a separate issue and not in this markdown file.

**Option B: `-pre`**
Expand Down Expand Up @@ -340,10 +335,12 @@ Examples are provided for the following theoretical versions...
|D|NPPP.E.B.0|8001.154.123<br>2003.364.123<br>17014.3944.123.0|Minor Patch Elapsed Build|Minor max is 64<br>Patch max is 999<br>Build max is 65535|
|E|NPP.E.B.0|801.154.123<br>203.364.123<br>1714.3944.123.0|Minor Patch Elapsed Build|Minor max is 99<br>Patch max is 99<br>Build max is 65535|

***Recommendation:*** Option D with Epoch=January 1, 2021.
***Recommendation:***
For 1.x, Option D was selected.
For 2.x, Option A is selected.

Option A works for a simple release strategy but doesn't work when there's regular
(e.g. daily) builds.
Option A works is the simplest to release and understand. As long as we don't hit 9999 Patches for the same Major.Minor,
then we will not run out of space in the DDLM package (more on that in 2.5)

Option B worked for WinUI 2.x and Windows App SDK 0.5 but is too limiting given it can't support
Minor versions beyond 6. It's also a complicated encoding scheme with date injected between Minor
Expand Down Expand Up @@ -397,7 +394,7 @@ following naming patterns release 0.x...

* WARfwk: `Microsoft.WindowsAppRuntime.<rmajor>.<rminor>[-tag]`
* WARmain: `Microsoft.WindowsAppRuntime.Main.<rmajor>.<rminor>[-tag]`
* WARddlm: `Microsoft.WindowsAppRuntime.DDLM.<major>.<minor>.<build>.<revision>-<shortarchitecture>[-shorttag]`
* WARddlm: `Microsoft.WindowsAppRuntime.DDLM.<rmajor>.<rminor>.<build>.<revision>-<shortarchitecture>[-shorttag]`

and release 1.x...

Expand All @@ -406,22 +403,55 @@ and release 1.x...
* WARsingleton: `MicrosoftCorporationII.WinAppRuntime.Singleton[-shorttag]`
* WARddlm: `Microsoft.WinAppRuntime.DDLM.<major>.<minor>.<build>.<revision>-<shortarchitecture>[-shorttag]`
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should be consistent in our language and Semantic Versioning language. This field if the Patch version.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should be consistent in our language and Semantic Versioning language. This field if the Patch version.

Yes - when we're discussing Semantic Versioning.

DDLM's package Name includes the MSIX package version, which uses DotQuadNumber terminology (or more specifically, as expressed in PACKAGE_VERSION and PackageVersion) which is a 4 part number with fields named Major, Minor, Build and Revision.

To avoid confusion that's why WARfwk+WARmain package Names including the WinAppSDK release's major+minor fields reference to them as <rmajor> and <rminor>, as defined on line 422

NOTE: rmajor/rminor are the release version, major/minor/build/revision are the MSIX package version


and release 2.x, when Breaking Change Boundary changed to 'Major' version...

* WARfwk: `Microsoft.WindowsAppRuntime.<rmajor>[-tag]`
* WARmain: `MicrosoftCorporationII.WinAppRuntime.Main.<rmajor>[-shorttag]`
* WARsingleton: `MicrosoftCorporationII.WinAppRuntime.Singleton[-shorttag]`
* WARddlm: `Microsoft.WinAppRuntime.DDLM.<rmajor>.<rminor>.<patch>.<revision>-<shortarchitecture>[-shorttag]`

where

* rmajor = Major version number of the project release, base-10, no leading zeros (e.g. "1" for WindowsAppSDK 1.2)
* rminor = Minor version number of the project release, base-10, no leading zeros (e.g. "2" for WindowsAppSDK 1.2)
* patch = Patch version number of the project release, base-10, no leading zeros
* major = Major version number of the release, base-10, no leading zeros
* minor = Minor version number of the release, base-10, no leading zeros
* build = Build version number, base-10, no leading zeros
* revision = Revision version number, base-10, no leading zeros
* architecture = Allowed values: "x86", "x64", "arm64"
* shortarchitecture = Allowed values: "x8", "x6", "a6"
* tag = Allowed values: "", "preview[#]", "experimental[#]"
* shorttag = Allowed values: "", "p[#]", "e[#]"
* tag = Allowed values: "", "preview", "experimental"
* shorttag = Allowed values: "", "p", "e"

**NOTE:** rmajor/rminor are the release version, major/minor/build/revision are the MSIX package
**NOTE:** rmajor/rminor/patch are the release version, major/minor/build/revision are the MSIX package
version (Microsoft.ProjectReunion.0.8-preview had a release version of 0.8
but an MSIX package version of 8000.146.628.0).
but an MSIX package version of 8000.146.628.0). Starting 2.0, these will now be the same numbers. The exception to that is
Singleton, since there is one package covering all releases. That package can't "go back" to Major=2, so we will add a
8000 to the Major for that package.

Since we will now match the release version with the MSIX, it is worth explaining how that is going to increment.
Every potential released build (stable, preview, experimental) will increase the Patch, unless the Major or Minor is increased.
If we notice an issue after building the canditate, we might choose not to release it, at which point the patch could bump twice.
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

could bump twice

could bump twice

suggest "again" instead of "twice", since this situation could repeat multiple times before a build is selected for release.

Major will increase when a stable or preview release contains Breaking Changes from the previous Stable release.
Minor will increase when a stable release contains new Functionality from the previous Stable release.
Experimental releases will always be a patch bump from the last release and based on the most recent stable or preview. The Major.Minor
will remain the same whether the experimental release contains big fixes, new functionality, or breaking changes.
Preview is optional if we feel the need to have a preview to split out the current experimental from the next Major release before
making an official stable release.
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggestion: All of these lines combining as a paragraph is okay, but it might be easier to read/scan to separate the major points in different bullets.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, I agree. In the .md file it looks OK and the linebreaks are made at the right places. In the rendering, these linebreaks are gone, and it's hard to digest. So, definitely, putting here bullet points in front of Major, Minor, Experimental, and Preview makes it easier to read.


A simplified example is this:
2.0.0 is the first stable release.
2.0.1-experimental is the first experimental. (contains 2.0.0 + some exp APIs, and some bug fixes)
2.0.2 is the 2nd stable release. (bug fixes moved into 2)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This doesn't make sense to me. 2.0.1 should be the 2nd stable release.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm with Morten here. The versions should be incremental in their own band. See NuGet's docs for a widely accepted and understood naming paradigm https://learn.microsoft.com/en-us/nuget/concepts/package-versioning?tabs=semver20sort#pre-release-versions

Using the 2.0 sematic versioning it should be

2.0.1-aaa
2.0.1-alpha10
2.0.1-alpha2
2.0.1-beta
2.0.1-experimental (<-- alphabetical order lets htis fit naturally here)
2.0.1-open
2.0.1-rc.2
2.0.1-rc.10
2.0.1-zzz
2.0.1

2.0.3-experimental is the 2nd experimental. (contains 2.0.1 + some exp APIs, and some more bug fixes)
2.0.4-experimental is the 3rd experimental. (contains 2.0.1 + some Breaking Changes, some exp APIs, and some more bug fixes)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this should be 2.0.3-experimental2 if it's the experimental version working its way to 2.0.3.
If it's working it ways towards 2.1.0, then it should be 2.1.0-experimentalX

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would like to explain how we are thinking about experimentals and why we came to this decision. Then I would love to hear your thought on it.

Experimental is not "working towards" the version it is on, it is based on the last public "+ some experimental bits". Those experimental bits might come in the next public, but might sit there for months, then go away. Let me give an example:

2.0.0 (stable)
2.0.1-exp (based on 2.0.0 + new exp APIs and some bug fixes)
2.0.2 (stable) (did not take those exp APIs, but did take the bug fixes)
2.0.3-exp (based on 2.0.2 + the same new exp APIs and more bug fixes)
2.0.4 (stable) (did not take those exp APIs, but again took the bug fixes)
2.0.5-exp (based on 2.0.4 + some bug fixes, removed the APIs)

It is fairly clear to people looking at the nugets in semver order the order we built things, and therefore which exp is based on which stable. Since 2.0.2-exp is "lower than" the stable, we need to actually bump the patch for exp builds to get the order right.

Had we done it where the new APIs lead to an increase in Minor, and used the # to distinuish 2 exps, we would see:

2.0.0 (stable)
2.1.0-exp1
2.0.1 (stable)
2.1.0-exp2
2.0.2 (stable)
2.0.3-exp1

That would lead to the following "order" when looking at VS:
2.1.0-exp2
2.1.0-exp1
2.0.3-exp1
2.0.2
2.0.1
2.0.0

But 2.0.2 is newer than either of the 2.1 exps, and 2.0.3 exp is also newer than those.

To prevent this, we could bump the minor on each stable after an exp had bumped the minor, but now we would be on 2.2 stable when we only had bug fixes. Another way to prevent the drop back in exp is we could always have exp on the next minor(or Major). We considered this aproach, but as mentioned above, 2.0.2 is newer than the 2.1 exps, but VS would make it hard to know that. It is also difficult to keep track of which 2.1 exp is based on which 2.0 stable.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Okay, so in the case, if preview means "on top of" instead of "leading up to", then I would expect the version number with the preview flag should be on the (patch or minor) version increment.

Continuing with the same example:

  • If 2.0.1-preview built is on top of 2.0.1 and meant to be a preview of 2.0.2
    => then 2.0.1-preview it should really be 2.0.2-preview

I do understand your intent now that you've explained... but if you have to explain it, that means it's not intuitive, leading to confusion (and a renewed sentiment of "why does Windows dev have to do everything different" 😜).

Just my 2-cents. I will adapt because I want to, but you should take into consideration that others may not have the same enthusiasm I do and would consider this another Lego they stepped on with windows dev...

Copy link
Contributor Author

@Dreynor87 Dreynor87 Dec 5, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

preview and experimental are different. We do see preview as "leading up to", but we would only give that as a next Major release, letting people know that the next Major is coming soon.

And we are bumping the patch when we have the tag, 2.0.0 stable was followed by 2.0.1-exp.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah, my apologies, I was mixed up due to an earlier comment about number of characters allowed in the version string, and jumped to the conclusion that you were replacing experimental with preview.

Ultimately, what matters most is how Visual Studio/dotnet package restores packages. It is going to choose them in this order:

  • Older - 2.0.1-experimental
  • Newer - 2.0.1-preview

As long as the dev knows what version the latest has what they want, then all is good.

Alternate Option

Let me throw a crazy idea at you... what if you use date version number for the suffix instead?

2.0.1-2025.1205

This is how I avoid mixups in my products. My customers know exactly what they're getting in that version because of when it was released.... and it allows for newer "experimental" version of an already establish major.minor.patch release... making it obvious that it was built on top of that version.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We also considered that, but the "-" symbol means "this is a non-stable build", so we don't want that on stable builds. In Semver that really should be in the build metadata with the "+" symbol, but:

  1. MSIX(which is really what this spec is about) does not have room for the date... the DDLM is already maxing things out.
  2. Nuget ignores the build metadata, and will even drop the package entirely if you are on an older nuget client when the build metadata exists.

2.1.0 is the 3rd stable release (some of the exp APIs went stable, and some bug fixes)
2.1.1-experimental is the 4th experimental. (contains 2.1.0 + some Breaking Changes, and some more bug fixes)
3.0.0-preview is the preview 3 public release
3.0.1-experimental (contains 3.0.1-preview + some new APIs not in the preview build)
3.0.3 is the first 3 stable release (we made 3.0.2, noticed issues we had not seen in preview, fixed and rebuilt)
3.0.4-experimental (contains 3.0.3 + the new APIs from 3.0.1-experimental)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The example here is good, but the markdown formatting is problematic since all lines get merged like a paragraph. I suggest starting each of these version example lines with "* " to make each line a bullet.


Version's fields have values 0-65535.

Expand All @@ -433,24 +463,24 @@ This leads to package Name length issues even for common cases:

|Package|Average|AverageLength|
| --- | :--- | :---: |
|WARfwk |Microsoft.WindowsAppRuntime.1.15-preview1|41|
|WARmain|Microsoft.WindowsAppRuntime.Main.1.15-preview1|46|
|WARsingleton|Microsoft.WindowsAppRuntime.Singleton-preview1|46|
|WARddlm|Microsoft.WinAppRuntime.DDLM.1.15.12345.24680-arm64-preview1|**<span style="color:red">64</span>**|
|WARfwk |Microsoft.WindowsAppRuntime.2-preview|37|
|WARmain|Microsoft.WindowsAppRuntime.Main.2-preview|42|
|WARsingleton|Microsoft.WindowsAppRuntime.Singleton-preview|45|
|WARddlm|Microsoft.WinAppRuntime.DDLM.1.15.12345.24680-arm64-preview|**<span style="color:red">59</span>**|

|Package|Min|MinLength|
| --- | :--- | :---: |
|WARfwk |Microsoft.WindowsAppRuntime.1.0-preview1|40|
|WARmain|Microsoft.WindowsAppRuntime.Main.1.0-preview1|45|
|WARsingleton|Microsoft.WindowsAppRuntime.Singleton-preview1|46|
|WARddlm|Microsoft.WinAppRuntime.DDLM.1.0.0.0-arm64-preview1|**<span style="color:red">52</span>**|
|WARfwk |Microsoft.WindowsAppRuntime.2-preview|37|
|WARmain|Microsoft.WindowsAppRuntime.Main.1-preview|42|
|WARsingleton|Microsoft.WindowsAppRuntime.Singleton-preview|45|
|WARddlm|Microsoft.WinAppRuntime.DDLM.1.0.0.0-arm64-preview|**<span style="color:red">50</span>**|

|Package|Max|MaxLength|
| --- | :--- | :---: |
|WARfwk |Microsoft.WindowsAppRuntime.65535.65535-preview1|48|
|WARmain|Microsoft.WindowsAppRuntime.Main.65535.65535-preview1|53|
|WARsingleton|Microsoft.WindowsAppRuntime.Singleton-preview1|46|
|WARddlm|Microsoft.WinAppRuntime.DDLM.65535.65535.65535.65535-arm64-preview1|**<span style="color:red">71</span>**|
|WARfwk |Microsoft.WindowsAppRuntime.65535-preview|41|
|WARmain|Microsoft.WindowsAppRuntime.Main.65535-preview|46|
|WARsingleton|Microsoft.WindowsAppRuntime.Singleton-preview|45|
|WARddlm|Microsoft.WinAppRuntime.DDLM.65535.65535.65535.65535-arm64-preview|**<span style="color:red">66</span>**|

Possible options we can use to shorten package Name:

Expand All @@ -468,54 +498,60 @@ WARddlm is needed until Dynamic Dependencies is 100% based on OS DynDep.
Best case (!) WARddlm exists until the minimum supported Windows release is Cobalt.

***Recommendation:*** The general package naming syntax is
`Microsoft.ProjectReunion[.SubName]-<rmajor>.<rminor>[-tag]`. WARddlm and WARsingleton are
`Microsoft.ProjectReunion[.SubName]-<rmajor>[-tag]`. WARddlm and WARsingleton are
exceptions to the rule (see below).

Windows App SDK 0.8 will use package Names of...
Windows App SDK 2.0 will use package Names of...

* WARfwk: `Microsoft.WindowsAppRuntime.<rmajor>.<rminor>[-tag]`
* WARmain: `Microsoft.WindowsAppRuntime.Main.<rmajor>.<rminor>[-tag]`
* WARfwk: `Microsoft.WindowsAppRuntime.<rmajor>[-tag]`
* WARmain: `Microsoft.WindowsAppRuntime.Main.<rmajor>[-tag]`
* WARsingleton: `Microsoft.WindowsAppRuntime.Singleton[-tag]`
* WARddlm: `Microsoft.WinAppRuntime.DDLM.<major>.<minor>.<build>.<revision>-<shortarchitecture>[-shorttag]`
* WARddlm: `Microsoft.WinAppRuntime.DDLM.<major>.<minor>.<patch>.<revision>-<shortarchitecture>[-shorttag]`

Using Decision 5: Version Encoding = Option D (NPPP.E.B.0) WARddlm's maximum package Name length is
`Microsoft.WinAppRuntime.DDLM.1714.3944.123.24680-arm64-p3` = 58 characters. This can be reduced
Using Decision 5: Version Encoding = Option D (M.N.P.0) WARddlm's maximum package Name length is
`Microsoft.WinAppRuntime.DDLM.1714.3944.123.24680-arm64-p` = 58 characters. This can be reduced
with the following rules:

* Major version <= 99
* Major version <= 999
* Minor version <= 999
* Build number <= 9999
* Patch number <= 9999
* Revision (security update) <= 99
* Architecture = 2 characters (x8=x86, x6=x64, a6=arm64)

In the unlikely event that Minor or Patch reach these limits, then the Major (for the Minor)
or Minor (for the Patch) will bump for all packages in order to keep these restrictions. If\When we reach Major version 1000, then
the Major version will be the Actual Major %1000. This works, since the Major is also included in the name.

This produces a worst case for WARddlm in Windows App SDK 99.888.7777.66 ARM64 Preview 3 to the following identifiers:

* Package Name = `Microsoft.WinAppRuntime.DDLM.99.888.7777.66-a6-p3` = 49 characters
* PackageFullName = `"Microsoft.WinAppRuntime.DDLM.99.888.7777.66-a6-p3_99.888.7777.66_arm64__8wekyb3d8bbwe"`
* PackageFamilyName = `"Microsoft.WinAppRuntime.DDLM.99.888.7777.66-a6-p3_8wekyb3d8bbwe"`
* PACKAGE_VERSION struct = `99.888.7777.66`
* PACKAGE_VERSION uint64 = `0x006303781E610042`
* Package Name = `Microsoft.WinAppRuntime.DDLM.999.888.7777.66-a6-p` = 49 characters
* PackageFullName = `"Microsoft.WinAppRuntime.DDLM.999.888.7777.66-a6-p_999.888.7777.66_arm64__8wekyb3d8bbwe"`
* PackageFamilyName = `"Microsoft.WinAppRuntime.DDLM.999.888.7777.66-a6-p_8wekyb3d8bbwe"`
* PACKAGE_VERSION struct = `999.888.7777.66`
* PACKAGE_VERSION uint64 = `0x03E703781E610042`

# 3. Conclusions

**Decision 1:** Windows App SDK version 0.* encodes `Major.Minor` into MSIX package Names starting with version 0.8.0.0.

**Decision 2:** Windows App SDK version 1.* encodes `Major.Minor` into MSIX package Names.

**Decision 3:** Windows App SDK version 2.* encodes `Major` into MSIX package Names.

**Decision 3:** Windows App SDK supports an optional 'tag' to indicate a non-Stable channel.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

there are 2 Decision 3's, renumber

A 'tag' comes in long and short (1-2 character) forms e.g. `-preview` and `-p`,
or `-preview1` and `-p1` (the digit suffix is optional).

**Decision 4:** Windows App SDK encodes version as `<minor><patch>.<epoch>.<build>.<securityupdate>`
i.e. format encoding `NPPP.E.B.0`. See
**Decision 4:** Windows App SDK encodes version as `<major>.<minor>.<patch>.<securityupdate>`
i.e. format encoding `M.N.P.0`. See
[2.4. Decision 4: Version Encoding](#24-decision-4-version-encoding) for more details.

**Decision 5:** MSIX package Names use the format
`Microsoft.WindowsAppRuntime[.SubName]-<rmajor>.<rminor>[-tag]`. WARddlm is an exception due to Name
length constraints. The specific packages Names in Windows App SDK 1.0:
`Microsoft.WindowsAppRuntime[.SubName]-<rmajor>[-tag]`. WARddlm is an exception due to Name
length constraints. The specific packages Names in Windows App SDK 2.0:

* WARfwk: `Microsoft.WindowsAppRuntime.<rmajor>.<rminor>[-tag]`
* WARmain: `MicrosoftCorporationII.WinAppRuntime.Main.<rmajor>.<rminor>[-shorttag]`
* WARfwk: `Microsoft.WindowsAppRuntime.<rmajor>[-tag]`
* WARmain: `MicrosoftCorporationII.WinAppRuntime.Main.<rmajor>[-shorttag]`
* WARsingleton: `MicrosoftCorporationII.WinAppRuntime.Singleton[-shorttag]`
* WARddlm: `Microsoft.WinAppRuntime.DDLM.<major>.<minor>.<build>.<revision>-<shortarchitecture>[-shorttag]`

Expand Down
23 changes: 11 additions & 12 deletions specs/Deployment/MSIXPackages.md
Original file line number Diff line number Diff line change
Expand Up @@ -110,10 +110,10 @@ SDK 1.0, 1.1 and 2.0 (Stable) are installed on an x86 system, the user will have

* Microsoft.WindowsAppRuntime.1.0
* Microsoft.WindowsAppRuntime.1.1
* Microsoft.WindowsAppRuntime.2.0
* Microsoft.WindowsAppRuntime.2
* MicrosoftCorporationII.WinAppRuntime.Main.1.0
* MicrosoftCorporationII.WinAppRuntime.Main.1.1
* MicrosoftCorporationII.WinAppRuntime.Main.2.0
* MicrosoftCorporationII.WinAppRuntime.Main.2
* MicrosoftCorporationII.WinAppRuntime.Singleton (version 2.0)
* Microsoft.WinAppRuntime.DDLM.0.146.711.0-x8
* Microsoft.WinAppRuntime.DDLM.1000.328.1510.0-x8
Expand Down Expand Up @@ -143,36 +143,35 @@ for more details.

Windows App SDK's MSIX packages use the following naming rules for package identity:

* Name = Microsoft.WindowsAppRuntime[.SubName].\<Major\>.\<Minor\>[-VersionTag]
* Name = Microsoft.WindowsAppRuntime[.SubName].\<Major\>[-VersionTag]
* Publisher = "CN=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, S=Washington, C=US"

where

* SubName -- optional package sub-name. Use to distinguish amongst the different packages
* Major -- major version of the release, e.g. "1" for Windows App SDK 1.0
* Minor -- minor version of the release, e.g. "0" for Windows App SDK 1.0
* VersionTag -- optional version tag to distinguish amongst channels and releases of a channel, e.g. "-preview2" for Windows App SDK 1.0 Preview 2
* VersionTag -- optional version tag to distinguish amongst channels, e.g. "-preview" for Windows App SDK Preview

## 3.1. Package Naming - SubName

The following SubName values are used:

| SubName | Package | Example |
|-|-|-|
| | Framework | Microsoft.WindowsAppRuntime.1.0-experimental1 |
| Main | Main | MicrosoftCorporationII.WinAppRuntime.Main.1.0-e1 |
| Singleton | Singleton | MicrosoftCorporationII.WinAppRuntime.Singleton-e1 |
| DDLM | Dynamic Dependency Lifetime Manager (DDLM) | Microsoft.WinAppRuntime.DDLM.0.146.711.0-x6-e1 |
| | Framework | Microsoft.WindowsAppRuntime.2-experimental |
| Main | Main | MicrosoftCorporationII.WinAppRuntime.Main.2-e |
| Singleton | Singleton | MicrosoftCorporationII.WinAppRuntime.Singleton-e |
| DDLM | Dynamic Dependency Lifetime Manager (DDLM) | Microsoft.WinAppRuntime.DDLM.2.3.11.0-x6-e |

## 3.2. Package Naming - Main

The Main package follows a different naming scheme

* Name = MicrosoftCcorporationII.WinAppRuntime.Main.\<ReleaseMajorMinor\>[-ShortVersionTag]
* Name = MicrosoftCcorporationII.WinAppRuntime.Main.\<ReleaseMajor\>[-ShortVersionTag]

where

* ReleaseMajorMinor = project release major.minor version number. See the [MSIX Package Versioning](https://github.com/microsoft/WindowsAppSDK/blob/main/specs/deployment/MSIXPackageVersioning.md) for more details.
* ReleaseMajor = project release major version number. See the [MSIX Package Versioning](https://github.com/microsoft/WindowsAppSDK/blob/main/specs/deployment/MSIXPackageVersioning.md) for more details.
* ShortVersionTag = short form of the VersionTag

ShortVersionTag is derived from a VersionTag by combining the 1st letter and the last digit (if any) for non-Stable channels (ShortVeresionTag is blank for the Stable channel, just like VersionTag).
Expand Down Expand Up @@ -202,7 +201,7 @@ where
* ShortArchitecture = short form of the Architecture (x6=x64, x8=x86, a6=arm64)
* ShortVersionTag = short form of the VersionTag

ShortVersionTag is derived from a VersionTag by combining the 1st letter and the last digit (if any) for non-Stable channels (ShortVeresionTag is blank for the Stable channel, just like VersionTag).
ShortVersionTag is derived from a VersionTag by using the 1st letter for non-Stable channels (ShortVeresionTag is blank for the Stable channel, just like VersionTag).

```C#
string ToShortVersionTag(string versionTag)
Expand Down
Loading