Conditional compilation depending on the framework version in C#

末鹿安然 提交于 2019-11-26 06:42:45

问题


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:

  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.




回答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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!