documentation/wiki/ChangeWaves.md
A Change Wave is a set of risky features developed under the same opt-out flag. The purpose of this is to warn developers of "risky" changes that will become standard functionality down the line. If there's something we think is worth the risk, we found that Change Waves were a good middle ground between making necessary changes and warning customers of what will soon be permanent.
Opt-out is a better approach for us because we'd likely get limited feedback when a feature impacts customer builds. When a feature does impact a customer negatively, it's a quick switch to disable and allows time to adapt. The key aspect to Change Waves is that it smooths the transition for customers adapting to risky changes that the MSBuild team feels strongly enough to take.
The opt-out comes in the form of setting the environment variable MSBUILDDISABLEFEATURESFROMVERSION to the Change Wave (or version) that contains the feature you want disabled. This version happens to be the version of MSBuild that the features were developed for. See the mapping of change waves to features below.
The opt-out should be just a temporary workaround for a problem - as the feature will anyways become permanent eventually. For this reason - please make sure to create or upvote a bug describing the issue making you opt-out.
A wave of features is eligible to "rotate out" (i.e. become standard functionality) six months after its release. For example, wave 16.8 stayed opt-out through wave 16.10, becoming standard functionality when wave 17.0 is introduced.
Change wave checks around features will be removed in the release that accompanies a new major version of .NET (for example, .NET 11, .NET 12).
MSBUILDDISABLEFEATURESFROMVERSION Value | Result | Receive Warning? |
|---|---|---|
| Unset | All Change Waves will be enabled, meaning all features behind each Change Wave will be enabled. | No |
Any valid & current Change Wave (Ex: 16.8) | All features behind Change Wave 16.8 and higher will be disabled. | No |
Invalid Value (Ex: 16.9 when valid waves are 16.8 and 16.10) | Default to the closest valid value (ascending). Ex: Setting 16.9 will default you to 16.10. | No |
Out of Rotation (Ex: 17.1 when the highest wave is 17.0) | Clamp to the closest valid value. Ex: 17.1 clamps to 17.0, and 16.5 clamps to 16.8 | Yes |
Invalid Format (Ex: 16x8, 17_0, garbage) | All Change Waves will be enabled, meaning all features behind each Change Wave will be enabled. | Yes |
MSBuild.runtimeconfig.json. Please note that any usage of BinaryFormatter is insecure.bin directory by default (reverted here and brought back here)Platform as default during Platform NegotiationMSBuild.runtimeconfig.json