Question

Dans les versions 64 bits de Windows, un logiciel 32 bits est installé dans les fichiers "c: \ program (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 simple / meilleur.

Était-ce utile?

La solution

Dans MSBuild 4.0+, il existe un $ (MSBuildProgramFiles32) property , que vous pouvez utiliser en toute confiance directement (surtout si vous êtes prêt à placer ToolsVersion = "4.0" en haut du fichier pour garantir son exécution). être disponible et Échec rapide si ce n'est pas le cas.

Si vous ne l'êtes pas et avez besoin de quelque chose qui puisse agir correctement même lorsqu'il est exécuté dans un environnement MSBuild 2.0 ou ultérieur (c'est-à-dire, retour aux environnements VS 2005), la solution complète est la suivante:

<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 annulant le Propriété réservée MSBuild nom MSBuildProgramFiles32 via un < PropertyGroup > ou < CreateProperty > est rejeté par MSBuild 4.0+ et ne peut donc pas être rendu plus net et continue de prendre en charge .NET 2.0.

Autres conseils

Ma solution consiste à vérifier si " c: \ fichiers de programme (x86) " existe, s'il existe, supposons qu'il s'agit d'un système d'exploitation 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' />

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

Essayez "$ (MSBuildExtensionsPath32) \ .."

.

Je pense qu’un moyen légèrement plus fiable consiste à saisir la variable Environnement "ProgramFiles (x86)". Dans un processus 64 bits sous Windows, cela pointe vers le répertoire de fichiers de programme 32 bits. Il sera vide sur une version 32 bits de Windows et je crois sur un processus wow64

.

J'ai rencontré pratiquement le même problème récemment avec certains scripts PowerShell. J'ai écrit une entrée de blog sur la manière dont un problème de répertoire de fichiers programme a été résolu. Langage différent évidemment mais cela peut vous aider.

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

Je suis tombé sur cette question en essayant de trouver un moyen générique dans MSbuild pour savoir s’il s’agissait d’un système d’exploitation à 32 ou 64 bits. Si quelqu'un d'autre le trouve également, j'ai utilisé ce qui suit:

<PropertyGroup>
  <OSBits Condition="$(ProgramW6432) != ''">x64</OSBits>
  <OSBits Condition="$(OSBits) == ''">x32</OSBits>
</PropertyGroup>

Apparemment, % ProgramW6432% n'est défini que sur les systèmes 64 bits.

Si vous exécutez la version 32 bits des outils Visual Studio (notamment dans VS2012, vous avez le choix entre 3 invites de commande différentes), $ (ProgramFiles) pointe sur "Program Files (x86)". / p>

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top