C# 中根据框架版本进行条件编译
是否有任何预处理器符号允许类似
#if CLR_AT_LEAST_3.5
// use ReaderWriterLockSlim
#else
// use ReaderWriterLock
#endif
或其他方式来执行此操作?
Are there any preprocessor symbols which allow something like
#if CLR_AT_LEAST_3.5
// use ReaderWriterLockSlim
#else
// use ReaderWriterLock
#endif
or some other way to do this?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
我认为没有任何预定义的“预处理器”符号。 不过,您可以像这样实现您想要的目标:
为您的项目创建不同的配置,为您想要支持的每个 CLR 版本创建一个配置。
为每个 CLR 版本选择一个符号,例如
VERSION2
、VERSION3
等。在每种配置中,定义与其关联的一个符号并取消定义所有其他符号。
在条件编译块中使用这些符号。
I don't think there are any predefined 'preprocessor' symbols. However you can achieve what you want like this:
Create different configurations of your project, one for every version of CLR you want to support.
Choose a symbol like
VERSION2
,VERSION3
etc. per CLR version.In every configuration, define the one symbol associated with it and undefine all others.
Use these symbols in conditional compilation blocks.
没有内置的,但您可以提供自己的。
对于这种特定场景,您可能希望将逻辑封装在(例如)包装器(锁)类中,这样就不会将
#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 等。There aren't any built in, but you can supply your own.
For this specific scenario, you might want to encapsulate the logic in (for example) a wrapper (lock) class, so that you don't have
#if
scattered through all the code; of course, if you are only doing a little locking it might not be worth the trouble.I use different configurations and/or projects to build for a variety of platforms - i.e. protobuf-net builds for .NET 2.0, .NET 3.0, mono, CF 2.0, CF 3.5 using this trick. The code has
#if
blocks based on different symbols to control logic - so, for example,BinaryFormatter
isn't available on CF,WCF
is only available with .NET 3.0,Delegate.CreateDelegate
isn't on CF 2.0, etc.您可以使用反射来动态检查特定类型(例如 ReaderWriterLockSlim)是否可用(而不是使用预处理器)。
这将为您带来优势,您可以部署产品的单一版本,并且拥有(或更新到).NET 3.5 的用户将受益于优化的代码。
You could use reflection to check dynamically whether a certain type like ReaderWriterLockSlim is available (instead of using the preprocessor).
This would give you the advantage that you can deploy a single version of your product and users having (or updating to) .NET 3.5 will benefit from the optimized code.
您可以使用 /define 编译器开关 手动设置此符号。 然后,为每个所需的 clr 版本创建不同的构建配置。
You could manually set this symbol using the /define compiler switch. Then you create different build configurations for each desired clr version.
如果这就是您需要做的全部,我想您可以使用Environment.Version,但就像divo 的 解决方案,它似乎确实留下了很多不必要的代码。
If that's all you needed to do, I suppose you could use Environment.Version, but like divo's solution, it does seem to leave a lot of unneccessary code there.