C#突破变化 - 在幕后

时间:2014-08-28 05:55:32

标签: c# visual-studio-2012 msbuild .net-4.5 csc

我们的prod和dev机器正在运行.Net 4.5但我们的构建服务器是.Net 4.0。我们的目标是.Net 4.0和我试图评估构建在4.0机器上的影响。在运行时prod我知道它将使用4.5程序集但是......

我已经阅读了MS关于VS 2012中的重大变化的文档,但我试图理解这是如何工作的。我可以复制lambda示例的问题。当我在4.0和4.5服务器上运行应用程序时,它的行为相同。我原以为运行时会解决4.5中的问题。 http://msdn.microsoft.com/en-us/library/vstudio/hh678682(v=vs.110).aspx

我还了解了4.5版的兼容性问题:http://msdn.microsoft.com/en-us/library/hh367887%28v=vs.110%29.aspx

编译时我认为它使用来自C:\ Program Files(x86)\ Reference Assemblies \ Microsoft \ Framework.NETFramework \ v4.0和运行时的引用它使用C:\ Windows \ Microsoft.NET \ Framework \ v4.0.30319。

我的问题是VS在2010年与2012年之间的行为有何不同。这是因为它使用了不同的MSBuild.exe或不同的CSC.exe吗?我通过进程监视器运行它,但它不清楚,因为它显示程序文件中的MSBuild但我找不到它。

1 个答案:

答案 0 :(得分:2)

  

我可以为lambda示例复制问题。当我在4.0和4.5服务器上运行应用程序时,它的行为相同。

如果你指的是在foreach循环中捕获迭代变量时C#中的行为发生了变化,那根本就不是框架。这是编译器的不同之处。如果您使用C#5编译器,您将获得新的行为 - 如果您使用C#4编译器,您将获得旧的行为。您可以针对.NET 2.0并针对只有.NET 2.0的计算机执行,如果使用C#5编译器进行编译,您仍然可以获得新的行为。

现在,如果您的构建服务器上只安装了.NET 4.0,那么它们将使用C#4编译器。基本上,您的选择是:

  • 使用将迭代变量复制到循环内声明的变量
  • 的旧解决方法
  • 在构建服务器上安装.NET 4.5,以获得C#5行为

然而,这对于这个特定问题非常具体。其他兼容性问题可能有不同的要求。