ビルド マシンに .NET 4.5 をインストールすると、VS 2010 によって生成される出力 IL イメージが変更されるかどうかを確認していました。
Access to Modified クロージャによる問題を回避するために、.NET 4.5 で foreach の動作が変更されたことを知っているので、動作を示す単純なアプリケーションを選択しました。
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」にファイルをコピーしています。
VS 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: