在编译时检查操作系统?

时间:2014-06-23 20:20:45

标签: c# visual-studio-2012

我在我的开发机器上使用.Net 4.5和MS Visual Studio 2012运行Windows 7 64位操作系统。我有几个使用System.Threading.Task命名空间的C#项目。我希望能够在我们所有开发人员都可以访问的服务器上构建这些项目。问题是该服务器运行的是Windows Server 2003,它不支持.Net 4.5,并且4.5之前的.Net版本中不存在System.Threading.Task命名空间。

我可以使用编译时常量设置新的构建配置,我可以检查以确定要包含哪个命名空间,但在我这样做之前,我想知道是否已经有一个我可以使用的预定义常量。我对此表示怀疑,因为据我所知,编译时常量只能在C#中定义或不定义,与C ++不同,它们可以具有特定的值。

1 个答案:

答案 0 :(得分:2)

首先,.NET 4.0中确实存在Task命名空间(或者更确切地说,任务命名空间),虽然具有更多有限的功能(读取:略少的糖方法)并且没有async / await关键字。虽然更有限,但这可能有助于简化将程序平台设置为.NET 4.0的可能性,因为这可以解决您的许多问题。

虽然您不能使用编译时常量(即由const关键字标记的项)来排除/包含代码,但您可以使用符号定义通过#if directive执行此操作。只要你正确地安排你的符号,这也是分离编译代码的有效方法,因为&,|和嵌套的#ifs都是允许的并且按预期工作。

然而,无论包含的命名空间如何,针对.NET 4.5构建的程序仍将运行4.5并且不会在不支持它的机器上工作,即使您使用的所有功能都是WERE 4.0版本。此外,您无法为每个构建配置更改.NET平台,但您可以通过制作调用相同文件和文件夹的镜像项目,而不是针对4.0进行构建。总而言之,我建议去4.0 阅读以下更新并转而使用Mono。

更新:另一个选择可能是考虑Mono,根据他们的Download Page,最新的Mono保持与Windows XP和Server 2003的兼容性。我建议获得Xamarin以便你可以测试运行针对Mono平台的代码,但请注意Mono读取与.NET相同的IL,而Xamarin旨在读取/写入与VS相同的项目和解决方案格式。