C# 根据C中的框架版本进行条件编译#

C# 根据C中的框架版本进行条件编译#,c#,c-preprocessor,conditional-compilation,C#,C Preprocessor,Conditional Compilation,是否有允许以下内容的预处理器符号 #if CLR_AT_LEAST_3.5 // use ReaderWriterLockSlim #else // use ReaderWriterLock #endif 或者其他方法来实现这一点?我认为没有任何预定义的“预处理器”符号。但是,您可以通过以下方式实现您想要的: 为您的项目创建不同的配置,每个版本的CLR都需要一个配置 为每个CLR版本选择一个符号,如VERSION2,VERSION3等 在每个配置中,定义与其关联的一个符号,并取消定义所有其他符

是否有允许以下内容的预处理器符号

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

或者其他方法来实现这一点?

我认为没有任何预定义的“预处理器”符号。但是,您可以通过以下方式实现您想要的:

  • 为您的项目创建不同的配置,每个版本的CLR都需要一个配置

  • 为每个CLR版本选择一个符号,如
    VERSION2
    VERSION3

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

  • 在条件编译块中使用这些符号


  • 您可以使用手动设置此符号。然后为每个所需的clr版本创建不同的生成配置。

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


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

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

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


    我使用不同的配置和/或项目为各种平台构建—即使用此技巧为.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上,等等。

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

    但它会使使用它成为一个完整的程序。。。可行,但不是很吸引人。特别是,某些.NET3.5功能(如表达式)很难通过反射来使用。Marc,我不会在整个代码中使用反射,只是为了检查客户机上是否有某个库/类型可用。这将非常类似于预处理器符号(即if条件,然后根据3.5是否存在而进行分支),显然,如果您选择此路径,则需要缓存任何反射结果。请注意,IIRC这仅适用于常规3.5,而不是CF 3.5-您可能需要相应地命名任何符号。