C# NET 4的条件编译

C# NET 4的条件编译,c#,.net-4.0,conditional-statements,conditional-compilation,C#,.net 4.0,Conditional Statements,Conditional Compilation,可能重复: 我有一些在.NET4中工作的代码,但在.NET3.5中不工作。在.NET3.5中,需要使用对Windows的互操作调用 我希望在这两种情况下都使用“ifdef”来使用不同的代码路径(最终我会反对.NET3.5代码) 当使用.NET4编译代码时,是否有预定义的指令值要标识 是否有一个与所有预定义指令(DEBUG,TRACE等)的良好链接?以下页面仅给出指令,但未给出标准预定义值: 我想这就是你想要的: #if NET40 ... #elif NET35 ... #e

可能重复:

我有一些在.NET4中工作的代码,但在.NET3.5中不工作。在.NET3.5中,需要使用对Windows的互操作调用

我希望在这两种情况下都使用“ifdef”来使用不同的代码路径(最终我会反对.NET3.5代码)

当使用.NET4编译代码时,是否有预定义的指令值要标识

是否有一个与所有预定义指令(
DEBUG
TRACE
等)的良好链接?以下页面仅给出指令,但未给出标准预定义值:


我想这就是你想要的:

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

编译器不知道任何特定的.NET Framework版本。它只看到引用程序集。也不能保证您的程序将以您的目标.NET版本运行。即使您是为2.0构建的,也可以使用.NET4.0CLR运行


改用
Environment.Version

这些似乎不是预定义的。编辑是真的。但是您可以使用类似以下内容编写微型.bat脚本
%windir%\microsoft.net\framework\v3.5\msbuild/m/p:Configuration=Release/p:DefineConstants=“NET35”/nologo/t:Build…
。最好有构建脚本。或者更可取的NAnt/MSbuild任务SSO框架确实无法提供现成的方法。或者在代码的第一行添加#define NET35(甚至在使用语句之前)。。然后对其他版本进行注释,在某些情况下,预处理器指令比if(constant)语句具有优势,因为理论上不满足该语句的代码不存在,也不会使编译器出错;当95%以上的代码相同时,这一点很重要,但这是一个很好的选择,但显然有一个限制,即只有当代码可以编译时,这才有效,因为这是一个运行时检查。