Thursday, August 28, 2008

Targeting .Net 2.0 from VS2008

Following on from the previous post about old assemblies being updated with the latest .Net 3.5 service pack, I thought it also worth mentioning the other gotcha that can happen when targeting old versions of .Net from VS2008.

If you have a project that is set to target .Net 2.0, VS will dutifully only allow you to add 2.0 assemblies to the project, ensuring that you don't accidentally make use of 3.0 or 3.5 framework features that perhaps aren't installed on the machines of your target audience.  However, VS will still use the latest compiler to compile the code, hence you can make use of 3.0 language features such as var, lambdas etc.  These work, even on a box with just the 2.0 framework installed, because they are all handled via compiler magic - there was no change to the resulting IL to support the new 3.0 language features.

Now this can either be a good or a bad thing.  Good, because you can start making use of the new language tools without requiring your customer to upgrade anything.  Why bad?  Three reasons I can think of:

  • For a big project, switching compilers is not a simple decision.  Your app has all been fully tested, both internally and through man-years of usage in the field, but by switching the compiler, you have (potentially) just changed every line of code.  The only sane thing to do would be a full regression test of the whole system - who's to say that the new 3.0 compiler doesn't have some bugs in it, or (equally likely, I think), it fixes some bugs that were present in the 2.0 compiler, but which your code unknowingly relied on to function correctly.
  • If you start using 3.0 features on your dev machines, don't forget that you'll also need to upgrade your CI build servers.  If they are only building your project, that might be an easy choice.  If they are shared by several teams, that may be more difficult.
  • If you ship code to the customer rather than binaries, you need to ensure that your customer is also happy to upgrade from VS2005 to VS2008, otherwise they won't be able to build your code anymore.

What can you do?  Well, if you're in the "it's a good thing" camp, then just get coding.  If the bad things are important to you, then the bad news is that there's not much you can do on your development machines to help (other than go back to VS2005!).  What you can do is to ensure that on your CI build machines you specify the TargetFramework option to MSBuild.  This forces MSBuild to use the appropriate versions of the compiler and other tools.  See this blog for more details. That way, if a dev uses some 3.0 language feature, it will cause the CI build to fail and hence get spotted nice and quickly. You don't have a CI server?  Shame on you.

No comments: