2009-07-02 9 views
29

Ich verwende MSBuild (über NAnt), um eine Reihe von VB.NET Baugruppen zu kompilieren. Da diese Assemblys von COM Interop abhängig sind, muss ich sicherstellen, dass sie im 32-Bit-Modus auf 64-Bit-Betriebssystemen ausgeführt werden. Ich kann die ausführbaren Assemblies auf 32-Bit kompilieren, indem Sie das Projekt in Visual Studio ändern, aber ich würde wirklich gerne alle ausführbaren Dateien in den 32-Bit-Modus auf dem Build-Server kompilieren können.Wie erzwinge ich MSBuild, für den 32-Bit-Modus zu kompilieren?

ich eine Reihe von Befehlszeilenparameter zu MSBuild ohne Glück versucht haben:

  • /p: Plattform = win32
  • /p: Plattform = x86
  • /p: = Processor x86

Was mache ich falsch? Gibt es einen Verweis auf die Eigenschaften, die MSBuild beim Kompilieren von VB-Projekten verwendet?

Antwort

18

Wenn die Assemblies selbst immer 32 Bit enthalten, fügen Sie die Einstellung der .vbproj-Datei hinzu. Das wird MSBuild aus der Gleichung nehmen.

einfach die folgende Zeile in die Anfangsproperty in der Datei .vbproj hinzufügen

<PlatformTarget>x86</PlatformTarget> 
+0

Nicht die Antwort, nach der ich suchte, aber endete, das einfachste/sicherste zu sein. –

+0

Wenn dies nicht die Antwort war, nach der Sie gesucht haben, warum wurde sie akzeptiert? ;-) @ Naders Antwort sollte die akzeptierte sein. :-) – darrenp

42

Nach MSDN, bist du das Richtige zu tun. Sieht aus wie /p:Platform=x86, aber eigentlich ist es vielleicht /p:PlatformTarget=x86.

Versuchen Sie, nur MSBuild aufrufen, direkt mit diesem Parameter (stellen Sie sicher, dass es mit Ihrem NAnt Datei für den richtigen Build-Konfiguration an der Build-Ausgabe kein Problem ist. Schauen (Debug/Veröffentlichung).

+4

+1 die Option -p: PlatformTarget funktionierte für mich –

+6

In der Tat Platform ist die "Lösung" Plattform und PlatformTarget ist die Projektplattform. Sie können den von Ihnen gewünschten benutzerdefinierten Wert in Platform verwenden, aber das PlatformTarget muss eines der folgenden sein: x86, x64, Itanium oder anycpu. –

+0

ja, zum Beispiel habe ich gerade benutzt: MSBuild/p: PlatformTarget = "x86"/p: RunCodeAnalysis = Falsch –

3

In Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf den Stammknoten ->Configuration Manager. Sie müssen eine lösungsweite Konfiguration definieren, die jedes darin enthaltene Projekt anweist, als 32-Bit-Version zu erstellen (Anmerkung: Sie haben wahrscheinlich bereits eine solche) mindestens ein Projekt, das als 32-Bit erstellt werden soll.) Eine schrittweise Anleitung finden Sie im MSDN-Blogpost Solution Configurations.

Dann geben Sie in Ihren Team Build.proj/.targets Dateien die gewünschte "Plattform" und "Geschmack" ein. Beispiel:

Sie können mehrere dieser Eigenschaftsabschnitte angeben, um mehrere Kombinationen zu erstellen. Ich würde die "Release | x86" -Zeichenfolge (oder wie auch immer es aussieht) direkt aus Ihrer .sln-Datei kopieren/einfügen, um sicherzustellen, dass sie genau übereinstimmt - Sie können sie nicht direkt aus dem Projektmappen-Explorer abrufen.

In Bezug auf Ihren Kommentar:

MSBuild Immobilienbewertung ist ziemlich komplex, da es deklarative und zwingend notwendig Stile mischt. Sehen Sie den Blogpost MSBuild Property Evaluation für Details. Ich ziehe es vor, mich nicht auf seine Feinheiten zu verlassen.

Es stimmt, dass in der Befehlszeile angegebene Eigenschaften alles andere überschreiben sollten, aber Team Build hat eine weitere Komplexitätsebene. The ComputeConfigurationList task is called repeatedly via a recursive MSBuild invokation, not as an ordinary task.Die Art und Weise, wie dies ausgeführt wird, besteht darin, die normalen Eigenschaften wie PlatformToBuild zu übernehmen und sie in eine Gruppe globaler Eigenschaften mit der Bezeichnung ConfigurationToBuild.PlatformToBuild (usw.) zu packen, die für jede Konfiguration einmal generiert werden. Dies macht die Teambuild-Engine intern viel flexibler, macht aber auch das Kommandozeilenverhalten schwieriger.

Sie könnten versuchen, ConfigurationToBuild.PlatformToBuild in der Befehlszeile direkt - es könnte funktionieren, ich bin mir nicht sicher. Aber es wird definitiv verhindern, dass Sie jemals mehr als eine Konfiguration in einer einzigen Builddefinition erstellen. Aus diesem Grund bleibe ich bei meinen Ratschlägen oben.

+0

Also was ich bekomme ist, dass es keine Möglichkeit gibt, eine bestimmte Plattform von der Kommandozeile aus zu erzwingen, wenn der Entwickler das Projekt nicht auf eine x86-Plattform setzt? Ich würde diesen Schritt gerne vermeiden, wenn möglich (da ich keine Kontrolle über neue Projekte habe, wenn sie erstellt werden). –

+0

Ja und Nein. Ich habe meine Antwort bearbeitet, um weitere Details zu liefern. Wenn Sie wirklich wissen wollen, wie das funktioniert, lesen Sie die Datei Microsoft.TeamFoundation.Build.targets aus% ProgramFiles% \ MSBuild –

1

Nachdem ich das genau gleiche Problem erlebt habe, wechselte ich von der Verwendung der Version von MSBuild um C:\WINDOWS\Microsoft.NET\Framework64 ... zu der Version um C:\WINDOWS\Microsoft.NET\Framework (Nr. 64) und Dinge kompiliert gerade gut.

+0

(aber berühren Sie sie nicht!) Die Komponenten wurden tatsächlich erfolgreich auf einem 32-Bit-Betriebssystem kompiliert (Nr 64-Bit-Framework installiert) und dann zur Laufzeit auf einem 64-Bit-Betriebssystem versagt. Aber ich vermute, dass Sie nicht einmal bestimmte Komponenten auf dem 64-Bit-Framework kompilieren konnten, also ist es ein guter Tipp. –

11

Nur für den Fall, das hilft, ich dieses Kommandozeilen verwendet, um meine x86-Plattform Ziel zu bauen:

C:\Windows\Microsoft.NET\Framework\v2.0.50727\MSBuild.exe my.sln /t:build /p:Configuration=Release;Platform=x86 
0

Die Nant msbuild-Task-Antwort auf diese Frage:

<msbuild project="your.sln"> 
    <property name="PlatformTarget" value="x86" /> 
</msbuild> 
0

Für MSBuild Version 15 es ist /p: PlatformTarget = x86