Repository navigation
Description
Our packages drop support for frameworks older than .NET Framework 4.6.1, .NET Core 3.1, or .NET Standard 2.0.
Reason
Dropping a framework from a package is a source breaking change. At the same time, continuing to build for all frameworks we ever shipped increases the complexity and size of a package. In the past, we've solved this issue by harvesting, which basically means:
- We build only for "current" frameworks
- During build, we download the earlier version of the package and "harvest" the binaries for earlier frameworks we no longer build for
While this means that you can always update without worrying that we drop a framework it also means that you'll never get any bug fixes or new features if you consume a harvested binary. In other words, harvested assets can't be serviced which is now hidden because from your point of view you're able to keep updating the package to a later version even thought you're consuming the same old binary that we're no longer updating.
For .NET 6, we plan to no longer perform any form of harvesting to ensure that all assets we ship can be serviced. This means we're dropping anything older than:
- .NET Framework 4.6.1
- .NET Core 3.1
- .NET Standard 2.0
If you're currently referencing an impacted package from an earlier framework, you'll no longer be able to update the referenced package to a later version. Your choice is to either retarget your project to a later version or not updating the referenced package (which is generally not a huge take back because you're already consuming a frozen binary anyways).
Affected packages
These packages no longer ship old frameworks:
Microsoft.Extensions.DependencyModelMicrosoft.Win32.Registry.AccessControlMicrosoft.Win32.SystemEventsSystem.ComponentModel.AnnotationsSystem.ComponentModel.CompositionSystem.ComponentModel.Composition.RegistrationSystem.Composition.AttributedModelSystem.Composition.ConventionSystem.Composition.HostingSystem.Composition.RuntimeSystem.Composition.TypedPartsSystem.Data.OdbcSystem.Diagnostics.DiagnosticSourceSystem.Diagnostics.EventLogSystem.Diagnostics.PerformanceCounterSystem.DirectoryServicesSystem.DirectoryServices.AccountManagementSystem.DirectoryServices.ProtocolsSystem.Drawing.CommonSystem.IO.PackagingSystem.IO.PipelinesSystem.ManagementSystem.Net.Http.WinHttpHandlerSystem.Reflection.ContextSystem.Runtime.CachingSystem.Runtime.CompilerServices.UnsafeSystem.Security.Cryptography.CngSystem.Security.Cryptography.OpenSslSystem.Security.Cryptography.PkcsSystem.Security.Cryptography.ProtectedDataSystem.ServiceProcess.ServiceControllerSystem.SpeechSystem.Text.Encoding.CodePagesSystem.Text.Encodings.WebSystem.Threading.AccessControlSystem.Threading.Channels
These packages will no longer be updated because their implementation is now part of the .NET 6 platform:
Microsoft.Win32.RegistrySystem.ComponentModel.AnnotationsSystem.IO.FileSystem.AccessControlSystem.IO.Pipes.AccessControlSystem.Security.AccessControlSystem.Security.Cryptography.CngSystem.Security.Cryptography.OpenSslSystem.Security.Principal.Windows
Timelines
Many of these changes are shipping in .NET 6 Preview 5 while some will ship in .NET 6 Preview 6.
Metadata
Metadata
Assignees
Labels
Type
Projects
- StatusShow more project fieldsDone
Activity
seangwright commentedon Jun 17, 2021
Harvesting sounds like a slightly dangerous practice. I never knew it happened before this announcement.
If I update a package to a newer version, I would expect to get that newer version's features and not the previous versions features under a new version number (dependent on my TFM).
Happy to hear this will no longer happen!
terrajobst commentedon Jun 17, 2021
I'd agree that the old model broke customer expectations but I don't believe it to be dangerous. It's not any different from the customer not upgrading their package.
GrabYourPitchforks commentedon Jun 17, 2021
To expand on Immo's comment above - when we build security patches for packages, we ensure that all binaries in the package are patched. This means that if we make an announcement "version 4.0.0 of <some package> has a vulnerability, and you should use version 4.0.1 instead," then every single binary contained within the 4.0.1 package will have the patch. We backport the patch and reharvest the patched binary if needed in order to fulfill this contract. So there shouldn't be any danger (from a security perspective) to consuming apps.
This "backport and reharvest" process generally only applies to security patches. We don't tend to backport new features or non-security bug fixes to harvested versions.
MagicAndre1981 commentedon Jun 18, 2021
But does not show that a lot of nuget updates in NuGet UI, because PackageReferenceInclude this doesn't allow version ranges like packages.config ?
terrajobst commentedon Jun 18, 2021
Potentially. Hence, the recommendation to update the consuming project to a later framework version.
joperezr commentedon Aug 5, 2021
@terrajobst for ZBB tracking, is it ok if we move the milestone of this issue to future?
terrajobst commentedon Aug 6, 2021
We can just close the announcement here. We should probably leave the milestone as 6.0.0 for clarity. Of course, people can still post comments here :-)