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:
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?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Weil das Standard ist wohl
Debug|AnyCPU
. Überprüfen Sie die erste<PropertyGroup>
in der Projekt-Datei, es sollte etwas in der Nähe von:setzt den Standard bauen, wenn
Configuration
oderPlatform
ist nicht auf der Kommandozeile. Die erste Gruppe könnte auch das einrichten eines Standard-Datei-Ausrichtung.AnyCPU
(wie in der Datei habe ich zitiert), dann ist die bedingte property group, den du zitiert hast, nicht anwenden wird. "Wenns" nötig, denn ohne zu sehen, mehr von Ihrem Projekt-Datei kann man nicht sagen.FileAlignment
- Eigenschaft auf eine generische Eigenschaft-Gruppe, in der Erwägung, dass meine fehlerhafte project-Datei hatte es in den Release|Jede CPU-Gruppe. Ich denke, was passiert sein könnte ist das upgrade ließ es ganz heraus und VS standardmäßig auf 256 in der Erwägung, dass MSBuild standardmäßig 8192. Wenn ich dann bearbeitet die Einstellungen in der VS beschlossen, fügen Sie es zum Release|Jede CPU-Gruppe, weil er nicht anwesend war, die in der generischen Gruppe. Vielleicht testen Sie diese Theorie morgen, wenn ich eine chance bekomme.x.zzproj
- Datei) kann einfacher sein, vor allem, um eine 100% konsistente ändern über mehrere Konfigurationen. Oder ändern Sie die IDE nicht direkt zulassen (x.sn
- Datei für mehrere Projekte verwiesen, die in Lösung-Ordner).Blick durch die Geschichte von meiner Projekt-Datei, bemerkte ich, dass gab es keine
FileAlignment
Eigentum, bis ich explizit den Wert in Visual Studio (was ich auch Tat, während zusammenbrauend meine Frage). Die Projekt-Datei musste aktualisiert wurden, aus VS2008 zu VS2010 (und ich denke, VS2005 nach VS2008 vor, dass), also ich gehe davon aus, dass etwas kaputt gegangen auf dem Weg.So, für jetzt mindestens, ich setze dies auf eine Kombination von gebrochenen upgrades und mich verwirrend, die mich beim schreiben der Frage. Ich kann immer noch nicht Recht erklären, das Verhalten, das ich sah (nach meinem post), aber die Dinge scheinen sich zu haben, richtete sich seit den
FileAlignment
wurde ausdrücklich Hinzugefügt.