38 votes

Utiliser le répertoire "Program Files" 32 bits dans msbuild

Dans les versions 64 bits de Windows, un logiciel 32 bits est installé dans "c: \ program files (x86)". Cela signifie que vous ne pouvez pas utiliser $ (programfiles) pour obtenir le chemin d'accès au logiciel (32 bits). Il me faut donc un $ (ProgramFiles32) pour résoudre ce problème dans mon projet MSBuild. Je ne veux pas changer le projet en fonction de l'OS sur lequel il tourne.

J'ai une solution que je vais publier, mais peut-être existe-t-il un moyen plus facile / meilleur.

42voto

Ruben Bartelink Points 23945

Dans MSBuild 4.0+, il y a un $(MSBuildProgramFiles32) de la propriété , que vous pouvez en toute confiance emploient directement (surtout si vous êtes prêt à mettre un ToolsVersion="4.0" dans le haut du fichier à garantir que ça va être disponible et Échouer Rapidement si elle n'est pas).

Si vous n'êtes pas et ont besoin de quelque chose qui peut Faire La bonne Chose, même lorsqu'il est exécuté dans un MSBuild 2.0 ou ultérieure de l'environnement (c'est à dire, de retour de VS 2005 environnements), la solution complète est:

<PropertyGroup>
    <!--MSBuild 4.0 property-->
    <ProgramFiles32>$(MSBuildProgramFiles32)</ProgramFiles32> 
    <!--Use OS env var as a fallback:- 32 bit MSBuild 2.0/3.5 on x64 will use this-->
    <ProgramFiles32 Condition=" '' == '$(ProgramFiles32)'">$(ProgramFiles%28x86%29)</ProgramFiles32>

    <!-- Handle MSBuild 2.0/3.5 running in 64 bit mode - neither of the above env vars are available. http://stackoverflow.com/questions/336633
       NB this trick (Adding a literal " (x86)" to the 64 bit Program Files path) may or may not work on all versions/locales of Windows -->
    <ProgramFiles32 Condition ="'$(ProgramFiles32)'=='' AND 'AMD64' == '$(PROCESSOR_ARCHITECTURE)'">$(ProgramFiles) (x86)</ProgramFiles32>

    <!--Catch-all - handles .NET 2.0/3.5 non-AMD64 and .NET 2.0 on x86 -->
    <ProgramFiles32 Condition=" '' == '$(ProgramFiles32)' ">$(ProgramFiles)</ProgramFiles32>
</PropertyGroup>

Malheureusement amélioration Progressive / polyfill primordial de la MSBuild réserve de propriété name MSBuildProgramFiles32 par <PropertyGroup> ou <CreateProperty> est rejeté par MSBuild 4.0+ donc il ne peut pas être fait plus propre et encore du soutien .NET 2.0.

16voto

Wimmel Points 7641

Ma solution est de regarder si "c: \ program files (x86)" existe, s'il existe, supposons qu'il s'agit d'un OS 64 bits. Sinon, utilisez le répertoire normal des fichiers du programme:

 <PropertyGroup>
  <ProgramFiles32 Condition="Exists('$(PROGRAMFILES) (x86)')">$(PROGRAMFILES) (x86)</ProgramFiles32>
  <ProgramFiles32 Condition="$(ProgramFiles32) == ''">$(PROGRAMFILES)</ProgramFiles32>
</PropertyGroup>
 

Je peux l'utiliser comme ça

 <Exec WorkingDirectory="src\app1" Command='"$(ProgramFiles32)\doxygen\bin\doxygen" Doxyfile' />
 

11voto

Rory MacLeod Points 4574

Dans MSBuild 4.0, $(MSBuildProgramFiles32) vous donnera le répertoire Program Files 32 bits.

4voto

JaredPar Points 333733

Je pense qu'un peu plus fiable est de saisir la variable d'Environnement "ProgramFiles(x86)". Dans un environnement 64 bits processus sur Windows cette pour les 32 bits de répertoire program files. Elle sera vide sur une version 32 bits de windows et je crois que sur un wow64 processus

J'ai couru dans pratiquement le même problème récemment avec certains scripts PowerShell. J'ai écrit un billet de blog sur la façon dont il a travaillé à travers le programme, les fichiers de répertoire en question. Langue différente, évidemment, mais il peut vous aider.

http://blogs.msdn.com/jaredpar/archive/2008/10/21/program-files-i-just-want-the-32-bit-version.aspx

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X