我正在检查在我们的构建机器上安装 .NET 4.5 是否会更改 VS 2010 生成的输出 IL 映像。
由于我知道 foreach 的行为在 .NET 4.5 中发生了变化,以避免由于Access to Modified closure导致的问题,所以我选择了一个展示该行为的简单应用程序。
class Program
{
private static void Main(string[] args)
{
var contents = new List<Func<int>>();
var s = new StringBuilder();
int[] values = new int[] { 4, 5, 6 };
foreach (int value in values)
{
contents.Add(() => value);
}
for (var k = 0; k < contents.Count; k++)
s.Append(contents[k]());
Console.WriteLine(s);
}
VS 2010 输出:666
VS 2012 输出:456
我在 VS 2010 中创建了一个控制台应用程序,并在 VS 2012 中创建了一个具有相同代码的控制台应用程序(均针对 .NET 4)。
但是,这两个控制台应用程序根据构建它们的 IDE 表现出不同的行为。在构建输出中,我检查了两者是否具有几乎相似的构建参数。所以我想知道最终可执行文件如何表现出不同的行为?.NET 4.5 是就地升级,因此两个 IDE 的编译器必须相同。
注意:我确实看过一个相关问题:VS 2010 和 VS 2012 中的不同 LINQ 答案,但它没有回答我关于为什么可执行行为不同的问题。
编辑 1: 正如mletterle提到的,我确实尝试在 VS 2010 命令提示符下使用 VS 2010 输出窗口中的命令行构建代码。生成的输出就像是用 VS 2012 构建的一样。
编辑2:
我在输出窗口中发布输出:
VS 2010: 构建开始于 2012 年 12 月 20 日晚上 11:04:56。
CoreClean:创建目录“obj\x86\Debug\”。GenerateTargetFrameworkMonikerAttribute:跳过目标“GenerateTargetFrameworkMonikerAttribute”,因为所有输出文件相对于输入文件都是最新的。核心编译:
C:\Windows\Microsoft.NET\Framework\v4.0.30319\Csc.exe /noconfig /nowarn:1701,1702 /nostdlib+ /platform:x86 /errorreport:prompt /warn:4 /define:DEBUG;TRACE /errorendlocation /preferreduilang :en-US /highentropyva- /reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.0\Microsoft.CSharp.dll" /reference:"C:\Program Files (x86 )\Reference Assemblies\Microsoft\Framework.NETFramework\v4.0\mscorlib.dll" /reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.0\System.Core.dll " /reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.0\System.Data.DataSetExtensions.dll" /reference:"C:\Program Files (x86)\Reference Assemblies \Microsoft\Framework.NETFramework\v4.0\System.Data。dll" /reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.0\System.dll" /reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\ Framework.NETFramework\v4.0\System.Xml.dll" /reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.0\System.Xml.Linq.dll" /debug+ /debug:full /filealign:512 /optimize- /out:obj\x86\Debug\TestConsoleApp.exe /target:exe /utf8output Program.cs Properties\AssemblyInfo.cs "C:\Users\105044960\AppData\Local\Temp .NETFramework,Version=v4.0.AssemblyAttributes.cs" _CopyAppConfigFile: 跳过目标 "_CopyAppConfigFile" 因为所有输出文件相对于输入文件都是最新的。CopyFilesToOutputDirectory: 复制文件从 "obj\x86\Debug\TestConsoleApp.exe" 到 "bin\Debug\TestConsoleApp.exe"。TestConsoleApp -> C:\Users\105044960\Documents\Visual Studio 2010\Projects\TestConsoleApp\TestConsoleApp\bin\Debug\TestConsoleApp.exe将文件从“obj\x86\Debug\TestConsoleApp.pdb”复制到“bin\Debug\TestConsoleApp.pdb”。
与 2012 年相比:
1>CoreClean: 1> 删除文件“c:\users\105044960\documents\visual studio 11\Projects\TestConsoleApp\TestConsoleApp\bin\Debug\TestConsoleApp.exe”。1> 删除文件“c:\users\105044960\documents\visual studio 11\Projects\TestConsoleApp\TestConsoleApp\bin\Debug\TestConsoleApp.pdb”。1> 删除文件“c:\users\105044960\documents\visual studio 11\Projects\TestConsoleApp\TestConsoleApp\obj\Debug\TestConsoleApp.csprojResolveAssemblyReference.cache”。1> 删除文件“c:\users\105044960\documents\visual studio 11\Projects\TestConsoleApp\TestConsoleApp\obj\Debug\TestConsoleApp.exe”。1> 删除文件“c:\users\105044960\documents\visual studio 11\Projects\TestConsoleApp\TestConsoleApp\obj\Debug\TestConsoleApp.pdb”。1>GenerateTargetFrameworkMonikerAttribute:1>跳过目标“GenerateTargetFrameworkMonikerAttribute”,因为所有输出文件相对于输入文件都是最新的。1>CoreCompile: 1> C:\Windows\Microsoft.NET\Framework\v4.0.30319\Csc.exe /noconfig /nowarn:1701,1702,2008 /nostdlib+ /platform:AnyCPU /errorreport:prompt /warn:4 /define :DEBUG;TRACE /errorendlocation /preferreduilang:en-US /highentropyva- /reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.0\Microsoft.CSharp.dll" /reference: "C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.0\mscorlib.dll" /reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4 .0\System.Core.dll" /reference:"C: