Warum MSBuild ausdrücklich die Einstellung der Ziel-Plattform?

Für ein einfaches Projekt von mir, ein release-build in Visual Studio erzeugt eine Versammlung der Größe 18,944 bytes. Wenn ich aber bauen die gleiche Lösung von der Befehlszeile aus mit MSBuild, bekomme ich eine Versammlung der Größe 28,672 bytes. Das ist ein Unterschied von 9,728 bytes.

Ich bin aufrufen von MSBuild mit:

msbuild /p:Configuration=Release /t:Rebuild MySolution.sln

In ILDasm, ich sah nur geringfügige Unterschiede in den Metadaten. Dumping und vergleichen Sie die Baum-Ansicht zeigt keine Unterschiede. Dumping und vergleichen Header ergab eine Ahnung:

Visual Studio Output                             MSBuild Output
//Size of init.data:              0x00000800    //Size of init.data:              0x00002000
//Size of headers:                0x00000200    //Size of headers:                0x00001000
//File alignment:                 0x00000200    //File alignment:                 0x00001000

Den Unterschied in der init-Daten die Größe ist 0x1800, oder 6,144 bytes. Der Unterschied in der header-Größe ist 0xE00, oder 3,584 Byte. Die Summe dieser beiden Unterschiede ist 9,728 bytes, welche Konten für die Diskrepanz. Der Unterschied in der Datei Ausrichtung ist 3,584 Byte.

Weiter unten sehe ich:

Visual Studio Output                                    MSBuild Output
//File size            : 18944                         //File size            : 28672
//PE header size       : 512 (496 used)    ( 2.70%)    //PE header size       : 4096 (496 used)    (14.29%)
//Data                 : 2048              (10.81%)    //Data                 : 8192              (28.57%)

So offensichtlich kommt es nur auf die Datei Ausrichtungen. Aber warum machen die Datei Ausrichtungen unterscheiden, wenn Gebäude von der Kommandozeile aus? In den erweiterten Einstellungen in Visual Studio, sehe ich, dass die Datei Ausrichtung ist in der Tat 512:

Warum MSBuild ausdrücklich die Einstellung der Ziel-Plattform?

Diese Eigenschaft manifestiert sich in der Projekt-Datei in eine PropertyGroup:

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    ...
    <FileAlignment>512</FileAlignment>
</PropertyGroup>

Aber beachten Sie die Kombination von $Configuration und $Platform? Auf eine Ahnung, habe ich versucht, diese von der Befehlszeile aus:

msbuild /p:Configuration=Release /p:Platform="Any CPU" /t:Rebuild MySolution.sln

Und dann die Ausgabe angepasst werden (in der Größe) perfekt!

Dies ist die einzige Eigenschaft, die Gruppe für eine release-Konfiguration, so ist es offensichtlich verwendet wird, indem Sie MSBuild verwenden, unabhängig davon, ob die Plattform angegeben ist. Um dies zu beweisen, änderte ich die OutputPath in dieser Eigenschaft Gruppe und baute dann mit MSBuild in der Befehlszeile. Sicher genug, nahm die neue Ausgabe-Verzeichnis.

Ich versucht, die änderung der Ausrichtung von 512 auf 1024 und dann gebaut in der Befehlszeile. Es verwendet es!

Warum ist es notwendig, explizit die Plattform, um für MSBuild abholen einer Datei alignment von 512 bytes?

Schreibe einen Kommentar