【问题标题】:Conditional compilation depending on the framework version in C#条件编译取决于 C# 中的框架版本
【发布时间】:2010-09-29 08:43:59
【问题描述】:

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

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

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

【问题讨论】:

  • 请注意,IIRC 这仅适用于 regular 3.5,不适用于 CF 3.5 - 您可能需要相应地命名任何符号。

标签: c# c-preprocessor conditional-compilation


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 但它会让使用它成为一个完整的猪......可行,但不是很有吸引力。特别是,某些 .NET 3.5 功能(如 Expression)将非常难以通过反射使用。
      • Marc,我不会在整个代码中使用反射,只是为了检查客户端机器上是否有某个库/类型可用。这与预处理器符号非常相似(即 if 条件,然后根据是否存在 3.5 进行分支)
      • 如果你走这条路,显然你需要缓存任何反射结果。
      【解决方案4】:

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

      对于这个特定场景,您可能希望将逻辑封装在(例如)一个包装器(锁)类中,这样您就不会在所有代码中散布#if;当然,如果你只是做一点锁定,那可能不值得这么麻烦。

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-05-10
          • 2020-01-19
          • 2012-06-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多