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
或者其他方法来实现这一点?我认为没有任何预定义的“预处理器”符号。但是,您可以通过以下方式实现您想要的:
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-您可能需要相应地命名任何符号。