问题
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?
回答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,VERSION3etc. per CLR version.In every configuration, define the one symbol associated with it and undefine all others.
Use these symbols in conditional compilation blocks.
回答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.
回答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.
回答4:
You could manually set this symbol using the /define compiler switch. Then you create different build configurations for each desired clr version.
回答5:
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.
来源:https://stackoverflow.com/questions/408908/conditional-compilation-depending-on-the-framework-version-in-c-sharp