Comment spécifier la plate-forme pour MSBuild?

155

J'essaie d'utiliser MSBuild pour créer une solution avec une plate-forme cible spécifiée (j'ai besoin des deux binaires, x86 et x64). Voici comment je l'ai essayé:

C:\WINDOWS\Microsoft.NET\Framework\v3.5>MsBuild SolutionPath\Solution.sln /t:Rebuild /p:Configuration=Release /p:Platform="x86"

Cependant, la construction échoue toujours si la plate-forme est différente de "Any CPU". Qu'est-ce que je fais mal?

Voici la sortie en temps que MSBuild imprime:

C: \ WINDOWS \ Microsoft.NET \ Framework \ v3.5> MsBuild SolutionPath \ Solution.sln / t: Rebuild / p: Configuration = Release / p: Platform = "x86" Microsoft (R) Build Engine Version 3.5.30729.1 [ Microsoft .NET Framework, version 2.0.50727.3082] Copyright (C) Microsoft Corporation 2007. Tous droits réservés.

La construction a commencé le 1.7.2010 8:28:10. Projet "SolutionPath \ Solution.sln" sur le nœud 0 (Reconstruire la cible (s)). SolutionPath \ Solution.sln: erreur MSB4126: la configuration de solution spécifiée "Release | x86" n'est pas valide. Veuillez spécifier une configuration de solution valide à l'aide des propriétés Configuration et Platform (par exemple MSBuild.exe Solution.sln / p: Configuration = Debug / p: Platform = "Any CPU") ou laissez ces propriétés vides pour utiliser la configuration de solution par défaut. Projet de construction terminé "SolutionPath \ Solution.sln" (Reconstruire le (s) objectif (s)) - ÉCHEC.

Échec de construction.

"SolutionPath \ Solution.sln" (Reconstruire la cible) (1) -> (ValidateSolutionConfiguration target) -> SolutionPath \ Solution.sln: erreur MSB4126: La configuration de solution spécifiée "Release | x86" n'est pas valide. Veuillez spécifier une configuration de solution valide à l'aide des propriétés Configuration et Platform (par exemple MSBuild.ex e Solution.sln / p: Configuration = Debug / p: Platform = "Any CPU") ou laissez ces propriétés vides pour utiliser la configuration de solution par défaut.

0 Warning(s)
1 Error(s)

Temps écoulé 00: 00: 00.03

Si j'essaie de le construire pour x86 / x64 avec devenv, cela fonctionne parfaitement, mais j'essaie de configurer un serveur de build sans installer toutes les versions nécessaires de Visual Studio. À propos, s'il existe un meilleur outil gratuit (qui prend en charge .NET Framework 4), j'aimerais en entendre parler.

David Božjak
la source
1
Comment ça échoue? Peut-être que certains projets ne prennent pas en charge la plate-forme x86?
Brian
3
Êtes-vous sûr de ne pas avoir besoin de / p: Platform = "Win32"?
Andrew Wyatt
Pour les futurs lecteurs qui arrivent ici et se demandent comment installer la version 2017 de MSBuild sur une machine sans installer Visual Studio, consultez cette autre question .
Wai Ha Lee
@AndrewWyatt - afaik - C ++ utilise Win32tandis que moden .NET utilisex86
Elliot Woods
@ElliotWoods - merci pour la clarification re: Win32 / x86 - mon point de vue n'aurait été que du point de vue C ++.
Andrew Wyatt

Réponses:

106

Si vous souhaitez créer votre solution pour x86 et x64 , votre solution doit être configurée pour les deux plates-formes. En fait, vous avez juste une configuration Any CPU .

Comment vérifier la configuration disponible pour un projet

Pour vérifier la configuration disponible pour un projet donné, ouvrez le fichier de projet ( *.csprojpar exemple) et recherchez un PropertyGroupavec la droite Condition.

Si vous voulez construire en Releasemode pour x86, vous devez avoir quelque chose comme ça dans votre fichier projet:

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

Comment créer et modifier la configuration dans Visual Studio

Panneau du gestionnaire de configuration
(source: microsoft.com )

Nouveau bouton de plateforme de solution
(source: msdn.com )

Nouveau panneau de plateforme de solution
(source: msdn.com )

Comment créer et modifier la configuration (sur MSDN)

Julien Hoarau
la source
Quelle est la différence entre l'utilisation de x86 ou x64?
Acaz Souza
2
x86 construit des dll / exécutables 32 bits et x64 des dlls / exécutables 64 bits.
Benjamin Baumann
@Julien puis-je / dois-je utiliser le fichier .targets pour configurer des configurations partagées?
Jan 'splite' K.
4
Certains projets utilisent Win32au lieu de, x86par exemple, CMakeceux générés font ( libssh2utilise CMake).
Jeroen Wiert Pluimers
212

Dans MSBuild ou Teamcity, utilisez la ligne de commande

MSBuild yourproject.sln /property:Configuration=Release /property:Platform=x64

ou utilisez une forme plus courte:

MSBuild yourproject.sln /p:Configuration=Release /p:Platform=x64

Cependant, vous devez quand même mettre en place une plateforme dans votre projet, voir la réponse de Julien Hoarau.

Tomas Kubes
la source
n'a pas réalisé le sous-paramètre pour / property pour identifier à la fois la configuration et la plate-forme. Merci
DRapp
7
Sachez que MSBuild ne considère pas les «configurations de solution» de Visual Studio, mais définit plutôt des propriétés avant d'exécuter le xxproj pour chaque projet de la solution. La plate-forme et la configuration seront les mêmes pour chaque projet de la solution, quel que soit le mélange de configurations de projet que vous avez sélectionné dans Visual Studio.
Laurent LA RIZZA
2
Ou peut-être plus court: / p: Configuration = Release; AnyOtherParameter = Abc123; Platform = x86
granadaCoder
1
Si cela aide quelqu'un, un argument multi-mots sur la ligne de commande est entouré de guillemets doubles. Alors Platform="Any CPU"ou Platform="Mixed Platforms"pour ceux qui en ont besoin.
John Doe le
14

Si vous essayez de le faire à partir de la ligne de commande, vous rencontrez peut-être un problème où une variable d'environnement à l'échelle de la machine 'Platform' est définie pour vous et travaille contre vous. Je peux reproduire cela si j'utilise la fenêtre de commande VS2012 au lieu d'une fenêtre de commande Windows standard.

À l'invite de commande, tapez:

définir la plate-forme

Dans une fenêtre de commande VS2012, j'ai une valeur prédéfinie «X64». Cela semble interférer avec tout ce qui se trouve dans mon fichier de solution.

Dans une fenêtre de commande standard, la commande 'set' entraîne un message "variable non définie" ... ce qui est bien.

Si le résultat de votre commande 'set' ci-dessus ne renvoie aucune valeur de variable d'environnement, vous devriez être prêt à partir.

JJMpls
la source
2
C'est bien sûr ainsi qu'une fenêtre de commande VS2012 x64 est différenciée d'une fenêtre de commande VS2012 x86. IOW, par conception, pas "interférence"
MSalters
0

Pour VS2017 et 2019 ... avec les fichiers de projet SDK de la bibliothèque principale moderne , la plate-forme peut être modifiée pendant le processus de construction. Voici un exemple pour passer à la anycpuplate - forme, juste avant l' CoreCompileexécution de la tâche intégrée :

<Project Sdk="Microsoft.NET.Sdk" >

  <Target Name="SwitchToAnyCpu" BeforeTargets="CoreCompile" >
    <Message Text="Current Platform=$(Platform)" />
    <Message Text="Current PlatformTarget=$(PlatformName)" />
    <PropertyGroup>
      <Platform>anycpu</Platform>
      <PlatformTarget>anycpu</PlatformTarget>
    </PropertyGroup>
    <Message Text="New Platform=$(Platform)" />
    <Message Text="New PlatformTarget=$(PlatformTarget)" />
  </Target>

</Project>

Dans mon cas, je construis un FPGA avec BeforeTargetset des AfterTargetstâches, mais je compile une application C # dans l'ensemble CoreCompile. (en partie parce que je peux vouloir une sorte d'application de ligne de commande, et en partie parce que je ne pouvais pas comprendre comment omettre ou remplacer CoreCompile)

Pour construire pour plusieurs binaires simultanés tels que x86 et x64: soit une tâche de construction manuelle distincte serait nécessaire, soit deux fichiers de projet distincts avec les paramètres <PlatformTarget>x86</PlatformTarget>et respectifs <PlatformTarget>x64</PlatformTarget>dans l'exemple ci-dessus.

gojimmypi
la source