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

发布于 2024-07-10 21:44:39 字数 155 浏览 7 评论 0原文

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

#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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

栀梦 2024-07-17 21:44:39

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

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

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

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

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

I don't think there are any predefined 'preprocessor' symbols. However you can achieve what you want like this:

  1. Create different configurations of your project, one for every version of CLR you want to support.

  2. Choose a symbol like VERSION2, VERSION3 etc. per CLR version.

  3. In every configuration, define the one symbol associated with it and undefine all others.

  4. Use these symbols in conditional compilation blocks.

夜血缘 2024-07-17 21:44:39

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

对于这种特定场景,您可能希望将逻辑封装在(例如)包装器(锁)类中,这样就不会将 #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.

絕版丫頭 2024-07-17 21:44:39

您可以使用反射来动态检查特定类型(例如 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.

陈独秀 2024-07-17 21:44:39

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

You could manually set this symbol using the /define compiler switch. Then you create different build configurations for each desired clr version.

随心而道 2024-07-17 21:44:39

如果这就是您需要做的全部,我想您可以使用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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文