.NET 4 的条件编译 [重复]

Posted

技术标签:

【中文标题】.NET 4 的条件编译 [重复]【英文标题】:Conditional compilation for .NET 4 [duplicate] 【发布时间】:2011-06-20 21:04:52 【问题描述】:

可能重复: Conditional compilation and framework targets

我有一些代码在 .NET 4 中有效,但在 .NET 3.5 中无效。在 .NET 3.5 中,它需要使用对 Windows 的互操作调用。

我想在这两种情况下使用“ifdef”来使用不同的代码路径(最终我将弃用 .NET 3.5 代码)。

是否有预定义的指令值来识别代码何时使用 .NET 4 编译?

是否有与所有预定义指令(DEBUGTRACE 等)的良好链接?下面的页面只给出了指令,而不是标准的预定义值:

C# Preprocessor Directives

【问题讨论】:

***.com/questions/2923210/… 【参考方案1】:

我想这就是你要找的:

#if NET40   
...  
#elif NET35  
...  
#else NET20  
...  
#endif  

【讨论】:

那些好像不是预定义的 这是真的。但是你可以用%windir%\microsoft.net\framework\v3.5\msbuild /m /p:Configuration=Release /p:DefineConstants="NET35" /nologo /t:Build ... 之类的东西编写微小的.bat 脚本。最好有构建脚本。或者更可取的 NAnt/MSbuild 任务 所以开箱即用的框架确实没有办法提供。 或者在代码的第一行添加#define NET35(甚至在 using 语句之前)。然后将其注释掉以用于其他版本,在某些情况下预处理器指令比 if(常量)语句具有优势因为不满足语句理论上的代码不存在并且不能使编译器出错;当 95% 以上的代码相同但在某些情况下 msdn.microsoft.com/en-us/library/ed8yd1ha.aspx【参考方案2】:

编译器不知道任何特定的 .NET Framework 版本。它所看到的只是参考程序集。也不能保证您的程序将使用您所针对的 .NET 版本运行。即使您是为 2.0 构建的,也很有可能使用 .NET 4.0 CLR 运行。

请改用Environment.Version

【讨论】:

这是一个不错的选择,但显然有一个限制,即只有在代码可以编译时才有效,因为它是运行时检查。

以上是关于.NET 4 的条件编译 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Fortran 2008 - 条件编译[重复]

编译器优化可以消除在 for 循环的条件中重复调用的函数吗?

C语言条件编译(ifdefifndefendif)

消除条件编译宏

C语言进阶--条件编译使用分析

C# 条件编译 (#if 和 Conditional)