Are there any preprocessor symbols which allow something like
#if CLR_AT_LEAST_3.5
// use ReaderWriterLockSlim
#else
// use ReaderWriterLock
#endif
You could use reflection to check dynamically whether a certain type like ReaderWriterLockSlim is available (instead of using the preprocessor).
This would give you the advantage that you can deploy a single version of your product and users having (or updating to) .NET 3.5 will benefit from the optimized code.
If that's all you needed to do, I suppose you could use Environment.Version, but like divo's solution, it does seem to leave a lot of unneccessary code there.
There aren't any built in, but you can supply your own.
For this specific scenario, you might want to encapsulate the logic in (for example) a wrapper (lock) class, so that you don't have #if
scattered through all the code; of course, if you are only doing a little locking it might not be worth the trouble.
I use different configurations and/or projects to build for a variety of platforms - i.e. protobuf-net builds for .NET 2.0, .NET 3.0, mono, CF 2.0, CF 3.5 using this trick. The code has #if
blocks based on different symbols to control logic - so, for example, BinaryFormatter
isn't available on CF, WCF
is only available with .NET 3.0, Delegate.CreateDelegate
isn't on CF 2.0, etc.
I don't think there are any predefined 'preprocessor' symbols. However you can achieve what you want like this:
Create different configurations of your project, one for every version of CLR you want to support.
Choose a symbol like VERSION2
, VERSION3
etc. per CLR version.
In every configuration, define the one symbol associated with it and undefine all others.
Use these symbols in conditional compilation blocks.
You could manually set this symbol using the /define compiler switch. Then you create different build configurations for each desired clr version.