Warum gibt es einen Unterschied im Verhalten einer in VS 2010 v.s. erstellten Anwendung? VS 2012?

Ich habe überprüft, ob durch die Installation von .NET 4.5 auf unseren Buildcomputern das von VS 2010 generierte Ausgabe-IL-Image geändert wird.

Seit ich weiß, hat sich das Verhalten von foreach in .NET 4.5 geändert, um Probleme aufgrund von zu vermeidenZugang zum geänderten VerschlussIch entschied mich für eine einfache Anwendung, die das Verhalten zeigte.

  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 Ausgabe: 666

VS 2012 Ausgabe: 456

Ich habe in VS 2010 eine Konsolenanwendung und in VS 2012 eine Konsolenanwendung mit demselben Code erstellt (beide auf .NET 4 ausgerichtet).

Beide Konsolenanwendungen zeigten jedoch je nach der IDE, mit der sie erstellt wurden, ein unterschiedliches Verhalten. In der Build-Ausgabe habe ich überprüft, ob beide fast ähnliche Build-Argumente haben. Also habe ich mich gefragt, wie sich die ausführbare Datei am Ende anders verhält? .NET 4.5 ist ein direktes Upgrade, daher muss der Compiler für beide IDEs identisch sein.

HINWEIS: Ich habe mir eine verwandte Frage angesehen:Unterschiedliche LINQ-Antworten in VS 2010 und VS 2012 Meine Frage, warum sich das ausführbare Verhalten unterschied, wurde nicht beantwortet.

EDIT 1: Wiemletterle Wie bereits erwähnt, habe ich versucht, den Code mithilfe der Befehlszeile im Ausgabefenster von VS 2010 in einer VS 2010-Eingabeaufforderung zu erstellen. Die resultierende Ausgabe hat sich so verhalten, als wäre sie mit VS 2012 erstellt worden.

EDIT 2:

Ich poste die im Ausgabefenster vorhandene Ausgabe:

VS 2010: Der Bau begann am 20.12.2012 um 23:04:56 Uhr.

CoreClean: Verzeichnis "obj \ x86 \ Debug \" erstellen. GenerateTargetFrameworkMonikerAttribute: Überspringen des Ziels "GenerateTargetFrameworkMonikerAttribute", da alle Ausgabedateien in Bezug auf die Eingabedateien auf dem neuesten Stand sind. CoreCompile:
C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ Csc.exe / noconfig / nowarn: 1701,1702 / nostdlib + / plattform: x86 / fehlerbericht: prompt / warn: 4 / define: DEBUG; TRACE / errorendlocation / preferreduilang : de-de / highentropyva- / reference: "C: \ Programme (x86) \ Reference Assemblies \ Microsoft \ Framework.NETFramework \ v4.0 \ Microsoft.CSharp.dll" / reference: "C: \ Programme (x86 ) \ Referenzassemblies \ Microsoft \ Framework.NETFramework \ v4.0 \ mscorlib.dll "/ Referenz:" C: \ Programme (x86) \ Referenzassemblies \ Microsoft \ Framework.NETFramework \ v4.0 \ System.Core.dll "/ reference:" C: \ Programme (x86) \ Referenzassemblys \ Microsoft \ Framework.NETFramework \ v4.0 \ System.Data.DataSetExtensions.dll "/ reference:" C: \ Programme (x86) \ Referenzassemblys \ Microsoft \ Framework.NETFramework \ v4.0 \ System.Data.dll "/ Referenz:" C: \ Programme (x86) \ Reference Assemblies \ Microsoft \ Framework.NETFramework \ v4.0 \ System.dll "/ Referenz: "C: \ Programme (x86) \ Reference Assemblies \ Microsoft \ Framework.NETFramework \ v4.0 \ System.Xml.dl l "/ Referenz:" C: \ Programme (x86) \ Referenzassemblies \ 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: Ziel" _CopyAppConfigFile "wird übersprungen, da alle Ausgabedateien in Bezug auf die Eingabedateien auf dem neuesten Stand sind. CopyFilesToOutputDirectory: Kopieren der Datei von "obj \ x86 \ Debug \ TestConsoleApp.exe" nach "bin \ Debug \ TestConsoleApp.exe". TestConsoleApp -> C: \ Users \ 105044960 \ Documents \ Visual Studio 2010 \ Projects \ TestConsoleApp \ TestConsoleApp \ bin \ Debug \ TestConsoleApp.exe Kopieren der Datei von "obj \ x86 \ Debug \ TestConsoleApp.pdb" nach "bin \ Debug \ TestConsoleApp" .pdb ".

VS 2012:

1> CoreClean: 1> Löschen der Datei "c: \ users \ 105044960 \ documents \ visual studio 11 \ Projects \ TestConsoleApp \ TestConsoleApp \ bin \ Debug \ TestConsoleApp.exe". 1> Löschen der Datei "c: \ users \ 105044960 \ documents \ visual studio 11 \ Projects \ TestConsoleApp \ TestConsoleApp \ bin \ Debug \ TestConsoleApp.pdb". 1> Löschen der Datei "c: \ users \ 105044960 \ documents \ visual studio 11 \ Projects \ TestConsoleApp \ TestConsoleApp \ obj \ Debug \ TestConsoleApp.csprojResolveAssemblyReference.cache". 1> Löschen der Datei "c: \ users \ 105044960 \ documents \ visual studio 11 \ Projects \ TestConsoleApp \ TestConsoleApp \ obj \ Debug \ TestConsoleApp.exe". 1> Löschen der Datei "c: \ users \ 105044960 \ documents \ visual studio 11 \ Projects \ TestConsoleApp \ TestConsoleApp \ obj \ Debug \ TestConsoleApp.pdb". 1> GenerateTargetFrameworkMonikerAttribute: 1> Überspringen des Ziels "GenerateTargetFrameworkMonikerAttribute", da alle Ausgabedateien in Bezug auf die Eingabedateien auf dem neuesten Stand sind. 1> CoreCompile: 1> C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ Csc.exe / noconfig / nowarn: 1701,1702,2008 / nostdlib + / Plattform: AnyCPU / Fehlerbericht: prompt / warn: 4 / define : DEBUG; TRACE / errorendlocation / preferreduilang: de / highentropyva- / reference: "C: \ Programme (x86) \ Referenzassemblies \ Microsoft \ Framework.NETFramework \ v4.0 \ Microsoft.CSharp.dll" / reference: "C: \ Programme (x86) \ Referenzassemblys \ Microsoft \ Framework.NETFramework \ v4.0 \ mscorlib.dll" / Referenz: "C: \ Programme (x86) \ Referenzassemblys \ Microsoft \ Framework.NETFramework \ v4 .0 \ System.Core.dll "/ Referenz:" C: \ Programme (x86) \ Referenzassemblies \ Microsoft \ Framework.NETFramework \ v4.0 \ System.Data.DataSetExtensions.dll "/ Referenz:" C: \ Programmdateien (x86) \ Referenzassemblys \ Microsoft \ Framework.NETFramework \ v4.0 \ System.Data.dll "/ Referenz:" C: \ Programmdateien (x86) \ Referenzassemblys \ Microsoft \ Framework.NETFramework \ v4.0 \ System.dll "/ Referenz:" C: \ Programme (x86) \ Reference Assemblies \ Microsoft \ Framework.NETFr amework \ v4.0 \ System.Xml.dll "/ reference:" C: \ Programme (x86) \ Reference Assemblies \ 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 Properties \ AssemblyInfo.cs "C: \ Users \ 105044960 \ AppData \ Local \ Temp.NETFramework, Version = v4.0.AssemblyAttributes.cs "1> CopyFilesToOutputDirectory: 1> Kopieren der Datei von" obj \ Debug \ TestConsoleApp.exe "nach" bin \ Debug \ TestConsoleApp.exe ". 1> TestConsoleApp -> C: \ Users \ 105044960 \ Documents \ Visual Studio 11 \ Projects \ TestConsoleApp \ TestConsoleApp \ bin \ Debug \ TestConsoleApp.exe 1> Kopieren der Datei von "obj \ Debug \ TestConsoleApp.pdb" nach "bin \ Debug" \ TestConsoleApp.pdb ".

Antworten auf die Frage(2)

Ihre Antwort auf die Frage