Microsoft’s naming strategy has always been a little controversial. Mostly, because there seem to be several different strategies. It is somewhat funny that the marketing division(s) can’t seem to make up their mind about how to call their products. Take a look at the following Microsoft product names (those are only excerpts):
- Windows versions: 3.1, 95, 98, ME
- Windows NT versions: NT 4, 2000, XP, Vista (and now, finally, 7)
- Office: 95, 97, 2000, XP, 2003, and “the 2007 Microsoft Office system”
And, is it really necessary that Vista ships in six editions? (According to Wikipedia, they are Windows Vista Starter, Windows Vista Home Basic, Windows Vista Home Premium, Windows Vista Business, Windows Vista Enterprise, and Windows Vista Ultimate. Not counting the “N editions”, because Microsoft isn’t really accountable for them.)
But of course, common sense is common sense whereas marketing is marketing. While I find it somewhat funny, I don’t really mind.
What I do mind, however, is Microsoft’s naming schema with the .NET platform, because that one’s really confusing. I’ll present a list of the existing .NET versions, simply so that I have a place to look it up in the future. If you get bored, please jump to GDR to the Rescue.
The First Ones
- .NET 1.0 (including C# 1, CLR/BCL version 1.0): This was the first version of .NET, and thus, it was aptly named, I think.
- .NET 1.1 (including C# 1, CLR/BCL version 1.1): This fixed a few bugs and APIs, and added a little bit. Was it aptly named? I think it didn’t add enough for a new major version, so probably yes.
- .NET 2.0 (including C# 2, CLR/BCL version 2.0): This was a big change to both the platform and the programming languages. It introduced generics, nullable types, lots of new classes in the Base Class Library, and so on. It was also a side-by-side release, ie. you had the option to install both .NET 1.1 and 2.0 on the same machine. Great. Sadly, it was also the last of the sensibly named versions.
The Strange Version 3.0
- .NET 3.0 (including .NET 2.0, WCF, WPF, WF, Windows CardSpace): This only added new libraries, it didn’t change the Base Class Library at all, and it also didn’t change the underlying platform. Any .NET application developed for 3.0 also worked on 2.0 unless it made use of one of the new libraries. Any .NET application developed for 2.0 also worked on 3.0 because 3.0 was not really a new version of .NET. It’s hard to say whether it was a side-by-side version or replaced 2.0, since it only added a few DLLs to an existing installation of .NET 2.0. The only reason, in my opinion, to call this “3.0” was for it to sound better, and it really confused the quite many developers. But it got worse.
The 3.5 Family
- .NET 2.0 SP1 (including C# 2, CLR/BCL version 2.0 SP1): I guess, this update fixed a few issues, but actually, it was designed to extend the CLR and BCL for the upcoming .NET 3.5, and thus it added a few members to existing classes in the Base Class Library. One that I took notice of was an additional overload in TypeBuilder.DefineProperty, which I made use of in re-motion, causing the framework to throw MissingMethodExceptions on other colleagues’ PCs. I think this version was not aptly named at all. Why make a service pack for .NET 2.0 with changes needed only by a subsequent version? But this decision was part of the .NET 3.5 misery.
- .NET 3.0 SP1 (including .NET 2.0 SP1, WCF, WPF, WF, Windows CardSpace): This was essentially .NET 3.0 but with .NET 2.0 SP1 applied. Since 3.0 was only 2.0 with libraries, 2.0 SP1 with those libraries became 3.0 SP1. Not confused yet? It gets worse…
- .NET 3.5 (including C# 3, .NET 3.0 SP1, LINQ): Now, this version introduced new versions of the main .NET programming languages, and it added LINQ. The CLR and BCL changes were already packaged as .NET 2.0 SP1, so 3.5 only needed to add some libraries (System.Core probably being the most important one). Of course, if you didn’t make use of the new libraries, your .NET 3.5 applications were actually .NET 2.0 SP1 or .NET 3.0 SP1 programs. In my opinion, this was a catastrophe. Why release the changes to the CLR and BCL separately as service packs for 2.0 (and thus 3.0), and then call the service packs plus libraries .NET 3.5? Why not make a new .NET 4.0 version, running side-by-side? Is the end goal total confusion? But, believe it or not, it got worse.
The 3.5 SP1 Disaster
- .NET 2.0 SP2 (including C# 2, CLR/BCL version 2.0 SP2): For .NET 3.5 SP1 (see below), a few changes to the CLR and BCL were needed again. Since 3.5 SP1 would still not contain a new version of the CLR and BCL, these changes had to be a service pack for .NET 2.0. I’ll explain its effects below.
- .NET 3.0 SP2 (including .NET 3.0 SP2, WCF, WPF, WF, Windows CardSpace): The libraries of .NET 3.0 plus the CLR and BCL of .NET 2.0 SP2.
- .NET 3.5 SP1 (including C# 3, .NET 3.0 SP2, LINQ, ADO.NET Entity Framework and Data Services, as well as some prerequisites for ASP.NET MVC) : This one was the perfect disaster. One of the goals of SP1 was to offer a lot of performance improvements, fix a few bugs, and add new features. For this, it required quite a few CLR changes (which were packaged separately as .NET 2.0 SP2, since 3.5 didn’t really need a new CLR, ahem…). You know, .NET 3.5 SP1 was required by SQL Server 2008 and thus linked to SQL Server’s release date. And in my opinion, that release date pressure lead to the fact that .NET 3.5 SP1 (and .NET 2.0 SP2 and .NET 3.0 SP2) introduced a lot of bugs. Really, a lot of bugs. Bugs in serialization, in Windows Forms, reflection (see also Stefan’s and Ayende’s post on this topic), WPF, type checking, and the C# compiler. And this is only an excerpt. Bugs not only in new features, but also in APIs that had been working nicely for a long time. This was probably one of the worst service packs ever. And it leads to a nice new three-letter acronym getting known better: GDR.
After the .NET 3.5 SP1 problem (with numerous easily reproducible bugs popping up on Microsoft Connect and many blog posts being written), Microsoft relatively quickly started to provide hotfixes for many of the issues. KB957541 for example. But, of course, hotfixes are only meant to be installed if you’ve already hit the wall, and they are a bit of a nightmare when you’re developing software that depends on them. (“Dear customer, before using my software, please install KB957541.” Sounds easy, often isn’t.)
So, it was communicated quite early that these hotfixes would be aggregated into one package (a service pack for the service pack, so to speak), which would be available for general download (and later, it would come via Windows Update at the same time .NET 3.5 SP1 got distributed there). At Microsoft, this is called a General Distribution Release, or GDR.
A GDR is a Microsoft TLA (Three Letter Acronym) for an update that is for everyone.
Later than announced, the GDR is finally here. (For manual download.)
(And still, it’s somewhat broken. For example, the GDR repairs issue KB957541 – I’ve verified this -, but the knowledge base article (as of 2009-01-15) doesn’t mention it in the list of fixed issues. I’ll report that, maybe it will get fixed.)
Now, we finally have another version of .NET that we can work with. It hasn’t got an official name yet, so I’ll just call it “.NET 3.5 SP1 + GDR”. Some parts of re-motion (mostly the web part, re-call) need to make use of additions made in .NET 3.5 SP1.
“To use re-motion 1.11.x, you need to have .NET 3.5 SP1 + GDR.”
“We already have .NET 2.0, and applications running on it. What should we do, and is it safe?”
Exercise: Answer these two questions. And: Are you sure it won’t break anything?
(How simple it would be to just say: Please install .NET 3.2 side-by-side.)
Update 2009-03-09: Fixed typo in Scott Hanselman’s name