Я проверял, не устанавливает ли установка .NET 4.5 на наших машинах сборки выходное изображение IL, сгенерированное VS 2010.
Поскольку я знаю, что поведение foreach изменилось в .NET 4.5, чтобы избежать проблем из-за Доступ к Измененному закрытию, я выбрал простой приложение, которое демонстрирует поведение.
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 должен быть одним и тем же.
ПРИМЕЧАНИЕ. Я рассмотрел связанный с этим вопрос: Различные ответы LINQ в VS 2010 и VS 2012, но он не ответил на мой вопрос о том, почему поведение исполняемого файла различались.
РЕДАКТИРОВАТЬ 1: Как упоминалось mletterle, я попытался создать код с помощью командной строки в окне вывода VS 2010 в командной строке VS 2010. Полученный результат вел себя так, как если бы он был построен с VS 2012.
ИЗМЕНИТЬ 2:
Я публикую вывод, присутствующий в окне вывода:
VS 2010: Сборка началась 12/20/2012 11:04:56.
CoreClean: создание каталога "obj\x86\Debug \". GenerateTargetFrameworkMonikerAttribute: пропустить цель "GenerateTargetFrameworkMonikerAttribute", потому что все выходные файлы актуальным в отношении входных файлов. CoreCompile:
C:\Windows\Microsoft.NET\Framework\v4.0.30319\Csc.exe/noconfig /nowarn: 1701,1702/nostdlib +/платформа: x86/errorreport: prompt/warn: 4 /define: DEBUG; TRACE/errorendlocation/preferreduilang: en-US /highentropyva -/reference: "C:\Program Files (x86)\Reference Сборки \Microsoft\Framework.NETFramework\v4.0\Microsoft.CSharp.dll" /reference: "C:\Program Files (x86)\Reference Сборки \Microsoft\Framework.NETFramework\v4.0\mscorlib.dll" /reference: "C:\Program Files (x86)\Reference Сборки \Microsoft\Framework.NETFramework\v4.0\System.Core.dll" /reference: "C:\Program Files (x86)\Reference Сборки \Microsoft\Framework.NETFramework\v4.0\System.Data.DataSetExtensions.dll" /reference: "C:\Program Files (x86)\Reference Сборки \Microsoft\Framework.NETFramework\v4.0\System.Data.dll" /reference: "C:\Program Files (x86)\Reference Сборки \Microsoft\Framework.NETFramework\v4.0\System.dll" /reference: "C:\Program Files (x86)\Reference Сборки \Microsoft\Framework.NETFramework\v4.0\system.Xml.dll" /reference: "C:\Program Files (x86)\Reference Сборки \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\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 студия 11\Проекты\TestConsoleApp\TestConsoleApp\Bin\Debug\TestConsoleApp.exe". 1 > Удаление файла "c:\users\105044960\documents\visual studio 11\Проекты\TestConsoleApp\TestConsoleApp\Bin\Debug\TestConsoleApp.pdb". 1 > Удаление файла "c:\users\105044960\documents\visual studio 11\Проекты\TestConsoleApp\TestConsoleApp\OBJ\Debug\TestConsoleApp.csprojResolveAssemblyReference.cache". 1 > Удаление файла "c:\users\105044960\documents\visual studio 11\Проекты\TestConsoleApp\TestConsoleApp\OBJ\Debug\TestConsoleApp.exe". 1 > Удаление файла "c:\users\105044960\documents\visual studio 11\Проекты\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 +/платформа: AnyCPU/errorreport: prompt /warn: 4/define: DEBUG; TRACE/errorendlocation/preferreduilang: en-US /highentropyva -/reference: "C:\Program Files (x86)\Reference Сборки \Microsoft\Framework.NETFramework\v4.0\Microsoft.CSharp.dll" /reference: "C:\Program Files (x86)\Reference Сборки \Microsoft\Framework.NETFramework\v4.0\mscorlib.dll" /reference: "C:\Program Files (x86)\Reference Сборки \Microsoft\Framework.NETFramework\v4.0\System.Core.dll" /reference: "C:\Program Files (x86)\Reference Сборки \Microsoft\Framework.NETFramework\v4.0\System.Data.DataSetExtensions.dll" /reference: "C:\Program Files (x86)\Reference Сборки \Microsoft\Framework.NETFramework\v4.0\System.Data.dll" /reference: "C:\Program Files (x86)\Reference Сборки \Microsoft\Framework.NETFramework\v4.0\System.dll" /reference: "C:\Program Files (x86)\Reference Сборки \Microsoft\Framework.NETFramework\v4.0\system.Xml.dll" /reference: "C:\Program Files (x86)\Reference Сборки \Microsoft\Framework.NETFramework\v4.0\System.Xml.Linq.dll" /debug +/debug: full/filealign: 512/optimize- /out:obj\Debug\TestConsoleApp.exe/target: exe/utf8output Program.cs Свойства \AssemblyInfo.cs "C:\Users\105044960\AppData\Local\Temp.NETFramework, Version = v4.0.AssemblyAttributes.cs" 1 > CopyFilesToOutputDirectory: 1 > Копирование файла из "obj\Debug\TestConsoleApp.exe" в "bin\Debug\TestConsoleApp.exe". 1 > TestConsoleApp → C:\Users\105044960\Documents\Visual Studio 11\Проекты\TestConsoleApp\TestConsoleApp\Bin\Debug\TestConsoleApp.exe 1 > Копирование файла из "obj\Debug\TestConsoleApp.pdb" в "Bin\Debug\TestConsoleApp.pdb".