Comment puis-je forcer MSBuild à compiler en mode 32 bits?
J'utilise MSBuild (via NAnt) pour compiler un tas de VB.NET assemblages. Parce que ces assemblys dépendent de COM Interop, je dois garantir qu'ils fonctionnent en mode 32 bits sur les systèmes d'exploitation 64 bits. je peux faire compiler les assemblys exécutables en 32 bits en changeant le projet dans Visual Studio, mais j'aimerais vraiment pouvoir forcer tous les exécutables à être compilés en mode 32 bits sur le serveur de construction.
J'ai essayé un certain nombre de paramètres de ligne de commande à MSBuild avec pas de chance:
- / P: plate-forme = win32
- / P: plate-forme = x86
- / p: ProcessorArchitecture=x86
Qu'est-ce que je fais de mal? Y a-t-il une référence aux propriétés que MSBuild utilise lors de la compilation de projets VB?
8 réponses
Si les assemblys eux-mêmes vont toujours être 32 bits, pourquoi ne pas ajouter le paramètre à la .fichier vbproj? Cela prendra MSBuild hors de l'équation.
Ajoutez simplement la ligne suivante au PropertyGroup initial dans le .fichier vbproj
<PlatformTarget>x86</PlatformTarget>
Selon MSDN , vous faites la bonne chose. On dirait /p:Platform=x86
, mais en fait, peut-être que c'est /p:PlatformTarget=x86
.
Essayez simplement D'appeler MSBuild directement avec ce paramètre (assurez-vous que ce n'est pas un problème avec votre fichier NAnt. Regardez la sortie de construction pour la bonne configuration de construction (Debug / Libération ).
Juste au cas où cela aiderait, j'ai utilisé cette ligne de commande pour construire ma cible de plate-forme x86:
C:\Windows\Microsoft.NET\Framework\v2.0.50727\MSBuild.exe my.sln /t:build /p:Configuration=Release;Platform=x86
Dans L'Explorateur de solutions, cliquez avec le bouton droit sur le nœud racine -> Gestionnaire de Configuration. Vous devez définir une configuration à l'échelle de la solution qui indique à chaque projet de construire en 32 bits. (REMARQUE: Vous en avez probablement déjà un si vous avez déjà défini au moins un projet à construire en 32 bits.) Pour une procédure pas à pas étape par étape, voir le billet de blog MSDN Configurations de Solution.
Ensuite, vous spécifiez la "plate-forme" et la "saveur" souhaitées dans votre Team Build .proj
/ .targets
fichiers. Par exemple:
<ConfigurationToBuild Include="Release|x86">
<FlavorToBuild>Release</FlavorToBuild>
<PlatformToBuild>x86</PlatformToBuild>
</ConfigurationToBuild>
Vous pouvez spécifier plusieurs de ces sections de propriétés pour avoir plusieurs combinaisons construites. Je copierais / collerais la chaîne" Release|x86 " (ou ce à quoi elle ressemble) directement à partir de votre fichier .sln
pour m'assurer qu'elle correspond exactement - vous ne pouvez pas l'obtenir directement à partir de L'Explorateur de solutions.
Concernant votre commentaire:
L'évaluation des propriétés MSBuild est assez complexe car elle mélange les styles déclaratif et impératif. Voir le billet de blog évaluation de la propriété MSBuild pour plus de détails. Je préfère ne pas compter sur ses subtilités.
Il est vrai que les propriétés spécifiées sur la ligne de commande doivent remplacer tout le reste, mais Team Build a une autre couche de complexité. la tâche ComputeConfigurationList est appelée à plusieurs reprises via une invocation MSBuild récursive, pas comme une tâche ordinaire . La façon dont il retire cela est de prendre les propriétés ordinaires comme PlatformToBuild
et de les envelopper dans un ensemble de propriétés globales appelé ConfigurationToBuild.PlatformToBuild
(etc.) qui sont générés à la volée, une fois pour chaque configuration. Cela rend le moteur de construction D'équipe beaucoup plus flexible en interne, mais cela rend également le piratage du comportement de ligne de commande que vous voulez plus difficile.
Vous pouvez essayer de définir ConfigurationToBuild.PlatformToBuild
sur la ligne de commande directement - cela pourrait fonctionner, Je ne suis pas sûr. Mais cela vous empêchera certainement de construire plus d'une configuration dans une seule définition de construction. Pour cette raison, je m'en tiens à mon conseil ci-dessus.
Après avoir rencontré exactement le même problème, je suis passé de l'utilisation de la version de MSBuild à C:\WINDOWS\Microsoft.NET\Framework64
... pour la version à C:\WINDOWS\Microsoft.NET\Framework
(no 64
) et les choses compilées très bien.
La réponse nant msbuild-Task à cette question:
<msbuild project="your.sln">
<property name="PlatformTarget" value="x86" />
</msbuild>
Un moyen plus pratique que j'utilise pour trouver la bonne propriété est d'ouvrir l'un des .projet csproj fichier (dans le cas de c#) et voir la propriété qui est affectée lorsque vous sélectionnez " x64 " / "AnyCPU" / " x86 " de Visual stdio. Quelle que soit la propriété modifiée, vous devez la définir à partir de la ligne de commande. Avec Visual studio 2015, il semble être . Vous pouvez donc appeler msbuild avec l'argument / P: Platform=x64 et cela devrait fonctionner.