Conditional compilation depending on the framework version in C#

前端 未结 5 1338
無奈伤痛
無奈伤痛 2020-11-27 06:08

Are there any preprocessor symbols which allow something like

#if CLR_AT_LEAST_3.5
// use ReaderWriterLockSlim
#else
// use ReaderWriterLock
#endif


        
相关标签:
5条回答
  • 2020-11-27 06:49

    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.

    0 讨论(0)
  • 2020-11-27 06:49

    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.

    0 讨论(0)
  • 2020-11-27 06:52

    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.

    0 讨论(0)
  • 2020-11-27 06:54

    I don't think there are any predefined 'preprocessor' symbols. However you can achieve what you want like this:

    1. Create different configurations of your project, one for every version of CLR you want to support.

    2. Choose a symbol like VERSION2, VERSION3 etc. per CLR version.

    3. In every configuration, define the one symbol associated with it and undefine all others.

    4. Use these symbols in conditional compilation blocks.

    0 讨论(0)
  • 2020-11-27 06:59

    You could manually set this symbol using the /define compiler switch. Then you create different build configurations for each desired clr version.

    0 讨论(0)
提交回复
热议问题