25

是否有任何预处理器符号允许类似

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

或其他方式来做到这一点?

4

5 回答 5

21

我认为没有任何预定义的“预处理器”符号。但是,您可以像这样实现您想要的:

  1. 为您的项目创建不同的配置,为您想要支持的每个版本的 CLR 配置一个。

  2. 为每个 CLR 版本选择一个符号VERSION2,例如 等。VERSION3

  3. 在每个配置中,定义一个与之关联的符号并取消定义所有其他符号。

  4. 在条件编译块中使用这些符号。

于 2009-01-03T11:10:11.213 回答
6

没有任何内置的,但您可以提供自己的。

对于这个特定的场景,您可能希望将逻辑封装在(例如)一个包装器(锁)类中,这样您就不会#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 上不可用,等等。

于 2009-01-03T11:24:38.063 回答
4

您可以使用反射来动态检查 ReaderWriterLockSlim 等特定类型是否可用(而不是使用预处理器)。

这将为您提供一个优势,即您可以部署产品的单个版本,并且拥有(或更新到).NET 3.5 的用户将从优化的代码中受益。

于 2009-01-03T11:13:55.340 回答
2

您可以使用/define 编译器开关手动设置此符号。然后为每个所需的 clr 版本创建不同的构建配置。

于 2009-01-03T11:10:48.030 回答
1

如果这就是你需要做的,我想你可以使用 Environment.Version,但就像divo 的解决方案一样,它似乎确实留下了很多不必要的代码。

于 2009-01-04T17:04:53.367 回答