<p>If you try to launch a .NET 3.5 application on a Windows computer which does not have this version of the .NET framework installed, you get a <code>FileNotFoundException</code> for some system assemblies (for example System.Core 3.5.0.0).</p>

<p>Is it possible to catch this exception and tell the user to upgrade their .NET framework or is it thrown too early to handle it?</p>

The simplest thing would just be to try it. (I don't have any non-3.5 machines to test it on, but I assume you do.)
Make your entry point a very simple one which just tries to load
```
System.Core.dll
```
and handles the exception appropriately. If it passes, move on to another class which can then use it. If it fails, give the appropriate error message and exit.
I
suspect
you don't need to have quite this level of isolation - so long as you don't have any fields which are of unavailable types, I wouldn't expect the assembly to be resolved until you first call a method which needs it. I'd have to consult CLR via C# to check. However, keeping it quite isolated would probably be safer - it avoids you accidentally introducing dependencies later. Heck, you could even have your "boot and check" type in a separate assembly which did nothing but launch another one if everything's okay.