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