是否有任何允许类似
的预处理器符号#if CLR_AT_LEAST_3.5
// use ReaderWriterLockSlim
#else
// use ReaderWriterLock
#endif
或其他一些方法吗?
答案 0 :(得分:21)
我认为没有任何预定义的'预处理器'符号。但是你可以达到你想要的效果:
创建项目的不同配置,每个配置适用于您要支持的每个CLR版本。
根据CLR版本选择VERSION2
,VERSION3
等符号。
在每个配置中,定义与其关联的一个符号,并取消定义所有其他符号。
在条件编译块中使用这些符号。
答案 1 :(得分:5)
没有任何内置功能,但您可以自己提供。
对于这种特定情况,您可能希望将逻辑封装在(例如)包装器(锁)类中,这样就不会在所有代码中散布#if
;当然,如果你只是做一点锁定,那可能不值得这么麻烦。
我使用不同的配置和/或项目来构建各种平台 - 即使用此技巧为.NET 2.0,.NET 3.0,mono,CF 2.0,CF 3.5构建protobuf-net。代码具有基于不同符号的#if
块来控制逻辑 - 因此,例如,BinaryFormatter
在CF上不可用,WCF
仅适用于.NET 3.0,{{1不在CF 2.0等等。
答案 2 :(得分:4)
您可以使用反射动态检查某个类型(如ReaderWriterLockSlim)是否可用(而不是使用预处理器)。
这将为您提供部署单个版本产品的优势,拥有(或更新).NET 3.5的用户将从优化代码中受益。
答案 3 :(得分:2)
您可以使用/define compiler switch手动设置此符号。然后为每个所需的clr版本创建不同的构建配置。
答案 4 :(得分:1)
如果这就是你需要做的全部,我想你可以使用Environment.Version,但是像divo's解决方案一样,它似乎在那里留下了许多不必要的代码。