Conditional compilation depending on the framework version in C#
Solution 1:
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.
Solution 2:
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.
Solution 3:
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.
Solution 4:
You could manually set this symbol using the /define compiler switch. Then you create different build configurations for each desired clr version.