Reputation: 170713
Are there any preprocessor symbols which allow something like
#if CLR_AT_LEAST_3.5
// use ReaderWriterLockSlim
#else
// use ReaderWriterLock
#endif
or some other way to do this?
Upvotes: 26
Views: 10172
Reputation: 36818
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.
Upvotes: 21
Reputation: 20183
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.
Upvotes: 1
Reputation: 1062520
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.
Upvotes: 6
Reputation: 176159
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.
Upvotes: 4
Reputation: 3335
You could manually set this symbol using the /define compiler switch. Then you create different build configurations for each desired clr version.
Upvotes: 2