msbuild x86 64bit x86-64 program-files

Utilice el directorio "Archivos de programa" de 32 bits en msbuild



x86 64bit (7)

En versiones de 64 bits de Windows, el software de 32 bits está instalado en "c: / archivos de programa (x86)". Esto significa que no puede usar $ (archivos de programa) para obtener la ruta al software (32 bits). Entonces necesito $ (ProgramFiles32) para superar esto en mi proyecto MSBuild. No quiero cambiar el proyecto dependiendo del sistema operativo en el que se ejecuta.

Tengo una solución que publicaré, pero tal vez haya una manera más fácil / mejor.


Creo que una forma un poco más confiable es tomar la variable de entorno "ProgramFiles (x86)". En un proceso de 64 bits en Windows, esto apuntará al directorio de archivos de programa de 32 bits. Estará vacío en una versión de 32 bits de Windows y creo en un proceso wow64

Me encontré con prácticamente el mismo problema recientemente con algunas secuencias de comandos de PowerShell. Escribí una entrada de blog sobre cómo se solucionó el problema del directorio de archivos del programa. Diferente lenguaje obviamente pero puede ayudarte.

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


Mi solución es buscar si existe "c: / archivos de programa (x86)", si existe, asume que es un sistema operativo de 64 bits. De lo contrario, use el directorio normal de archivos de programa:

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

Puedo usarlo así

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


Me encontré con esta pregunta tratando de encontrar una forma genérica en MSbuild para ver si era un sistema operativo de 32 o 64 bits. En caso de que alguien más también encuentre esto, utilicé lo siguiente:

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

Aparentemente %ProgramW6432% solo está configurado en sistemas de 64 bits.


Pruebe con "$(MSBuildExtensionsPath32)/.."


En MSBuild 4.0, $(MSBuildProgramFiles32) le proporcionará el directorio Archivos de programa de 32 bits.


En MSBuild 4.0+, hay una propiedad $(MSBuildProgramFiles32) para él, que puede emplear con confianza directamente (especialmente si está preparado para poner ToolsVersion="4.0" en la parte superior del archivo para garantizar que estará disponible y Fail Fast si no es así).

Si no lo es y necesita algo que pueda hacer lo correcto, incluso cuando se ejecuta en un entorno MSBuild 2.0 o posterior (es decir, volver a entornos VS 2005), la solución completa es:

<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://.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>

Lamentablemente, MSBuild 4.0+ rechaza la mejora progresiva / MSBuildProgramFiles32 nombre de propiedad reservada de MSBuild MSBuildProgramFiles32 través de <PropertyGroup> o <CreateProperty> por lo que no se puede volver más ordenada y aún es compatible con .NET 2.0.


Si ejecuta la versión de 32 bits de las herramientas de Visual Studio (especialmente en VS2012, hay como 3 avisos de comando diferentes que puede elegir), $ (Archivos de programa) señala a "Archivos de programa (x86)"