2009-07-02 6 views
29

J'utilise MSBuild (via NAnt) pour compiler un ensemble d'assemblages VB.NET. Étant donné que ces assemblys dépendent de COM Interop, je dois garantir qu'ils s'exécutent en mode 32 bits sur les systèmes d'exploitation 64 bits. Je peux obtenir les assemblys exécutables à compiler 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.Comment forcer MSBuild à compiler en mode 32 bits?

J'ai essayé un certain nombre de paramètres de ligne de commande à MSBuild sans chance:

  • /p: Plate-forme = win32
  • /p: Plate-forme x86 =
  • /p: ProcessorArchitecture = x86

Qu'est-ce que je fais mal? Y at-il une référence aux propriétés que MSBuild utilise lors de la compilation de projets VB?

Répondre

18

Si les assemblages eux-mêmes sont toujours 32 bits, pourquoi ne pas ajouter le paramètre au fichier .vbproj? Cela enlèvera MSBuild de l'équation.

Il suffit d'ajouter la ligne suivante à la PropertyGroup initiale dans le fichier .vbproj

<PlatformTarget>x86</PlatformTarget> 
+0

Pas la réponse que je cherchais mais a fini par être le plus simple/le plus sûr. –

+0

Si ce n'était pas la réponse que vous cherchiez, pourquoi a-t-elle été acceptée? ;-) @ La réponse de Nader devrait être acceptée. :-) – darrenp

42

Selon MSDN, vous faites la bonne chose. On dirait /p:Platform=x86, mais en fait, c'est peut-être /p:PlatformTarget=x86.

Essayez juste appeler MSBuild directement avec ce paramètre (assurez-vous qu'il est pas un problème avec votre fichier NAnt. Regardez la sortie de génération pour la bonne configuration de construction (Debug/de presse).

+4

+1 l'option -p: PlatformTarget a fonctionné pour moi –

+6

En fait, Platform est la plate-forme "solution" et PlatformTarget est la plate-forme du projet. Vous pouvez avoir n'importe quelle valeur personnalisée dans Platform, mais le PlatformTarget doit être l'un des suivants: x86, x64, Itanium ou anycpu. –

+0

oui, par exemple je juste utilisé: MSBuild/p: PlatformTarget = "x86"/p: RunCodeAnalysis = False –

3

Dans Solution Explorer, cliquez avec le bouton droit sur le nœud racine ->Configuration Manager 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, consultez l'article de blog MSDN Solution Configurations. Puis, vous spécifiez la "plate-forme" et la "saveur" souhaitées dans vos fichiers Team Build.proj/. Par exemple:

<ConfigurationToBuild Include="Release|x86"> 
    <FlavorToBuild>Release</FlavorToBuild> 
    <PlatformToBuild>x86</PlatformToBuild> 
</ConfigurationToBuild> 

Vous pouvez spécifier plusieurs de ces sections de propriété pour avoir plusieurs combinaisons construites. Je copierais/collerais la chaîne "Release | x86" (ou quelque chose comme ça) directement à partir de votre fichier .sln pour s'assurer qu'il correspond exactement - vous ne pouvez pas l'obtenir directement à partir de l'Explorateur de solutions.

En ce qui concerne votre commentaire:

MSBuild évaluation de la propriété est assez complexe car il mélange les styles déclaratifs et impératifs. Voir le blog MSBuild Property Evaluation 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é. The ComputeConfigurationList task is called repeatedly via a recursive MSBuild invokation, not as an ordinary task.La façon dont il tire ceci est de prendre les propriétés ordinaires comme PlatformToBuild et les envelopper dans un ensemble de propriétés globales appelées ConfigurationToBuild.PlatformToBuild (etc.) qui sont générées à la volée, une fois pour chaque configuration. Cela rend le moteur Team Build beaucoup plus flexible en interne, mais il rend également le comportement de la ligne de commande que vous voulez plus difficile.

Vous pouvez essayer de définir ConfigurationToBuild.PlatformToBuild directement sur la ligne de commande - cela peut fonctionner, je ne suis pas sûr. Mais cela vous empêchera de créer plus d'une configuration dans une même définition de construction. Pour cette raison, je m'en tiens à mon conseil ci-dessus.

+0

Donc ce que je reçois est qu'il n'y a pas un moyen de forcer une plate-forme spécifique de la ligne de commande à moins que le développeur configure le projet pour avoir une plate-forme x86? Je voudrais vraiment éviter cette étape si possible (puisque je n'ai pas de contrôle sur les nouveaux projets quand ils sont créés). –

+0

Oui et non. J'ai modifié ma réponse pour fournir plus de détails. Si vous voulez vraiment savoir comment cela fonctionne, lisez (mais ne touchez pas!) Le fichier Microsoft.TeamFoundation.Build.targets trouvé dans% ProgramFiles% \ MSBuild –

1

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 ... à la version à C:\WINDOWS\Microsoft.NET\Framework (pas 64) et les choses compilées très bien.

+0

Les composants ont été compilés avec succès sur un OS 32 bits (non 64bit framework installé), puis échouant à l'exécution sur un système d'exploitation 64 bits. Mais je suppose que vous ne pouvez même pas compiler certains composants sur le framework 64 bits, donc c'est un bon conseil. –

11

Juste au cas où cette aide, 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 
0

La réponse msbuild-Task Nant à cette question:

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

Pour la version MSBuild 15 il est /p: PlatformTarget = x86

Questions connexes