2009-01-03 60 views
23

是否有允许类似条件编译依赖于C#的框架版本

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

或其他方式来做到这一点任何预处理符号?

+0

请注意,IIRC只适用于* regular * 3.5,而不是CF 3.5 - 您可能需要相应地命名任何符号。 – 2009-01-03 11:29:20

回答

21

我不认为有任何预定义的“预处理器”符号。然而,你可以达到你想要的东西是这样的:

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

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

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

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

4

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

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

+2

但它会使它使用一个完整的猪...可行,但不是很有吸引力。特别是,一些.NET 3.5功能(如Expression)通过反射非常难以使用。 – 2009-01-03 11:26:10

5

有没有内置,但你可以提供自己的。

对于这种特定场景,您可能希望封装(例如)封装(锁)类中的逻辑,以便在所有代码中不分散#if;当然,如果你只是稍微锁定一点,那可能不值得麻烦。

我使用不同的配置和/或项目来构建各种平台 - 即使用这个技巧,为.NET 2.0,.NET 3.0,单声道,CF 2.0,CF 3.5构建的protobuf-net。该代码具有基于控制逻辑不同符号#if块 - 因此,例如,BinaryFormatter上不可用CF,WCF仅适用于.NET 3.0,Delegate.CreateDelegate不在CF 2.0等

1

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