Используйте 32-битный каталог Program Files в msbuild - PullRequest
37 голосов
/ 06 декабря 2008

В 64-битных версиях Windows 32-битное программное обеспечение установлено в «c: \ program files (x86)». Это означает, что вы не можете использовать $ (программные файлы), чтобы получить путь к (32-битному) программному обеспечению. Поэтому мне нужно $ (ProgramFiles32), чтобы преодолеть это в моем проекте MSBuild. Я не хочу менять проект в зависимости от операционной системы, на которой он запущен.

У меня есть решение, которое я опубликую, но, возможно, есть более простой / лучший способ.

Ответы [ 7 ]

41 голосов
/ 13 апреля 2011

В MSBuild 4.0+ для него есть свойство $(MSBuildProgramFiles32) , которое вы можете с уверенностью использовать напрямую (особенно если вы готовы поставить ToolsVersion="4.0" в верхней части файла, чтобы гарантировать он будет доступен и Fail Fast , если его нет).

Если вам это не нужно и вам нужно что-то, что может делать правильные вещи, даже когда выполняется в среде MSBuild 2.0 или более поздней версии (т. Е. Обратно в среды VS 2005), полное решение:

<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>

К сожалению Прогрессивное улучшение / polyfill переопределение зарезервированного свойства MSBuild name MSBuildProgramFiles32 через <PropertyGroup> или <CreateProperty> отклонено MSBuild 4.0+, поэтому его нельзя сделать более аккуратным и поддерживать .NET 2.0.

16 голосов
/ 06 декабря 2008

Мое решение - посмотреть, существует ли «c: \ program files (x86)», если оно существует, предположим, что это 64-битная ОС. В противном случае используйте обычный каталог программных файлов:

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

Я могу использовать это так

<Exec WorkingDirectory="src\app1" Command='"$(ProgramFiles32)\doxygen\bin\doxygen" Doxyfile' />
11 голосов
/ 07 декабря 2010

В MSBuild 4.0 $(MSBuildProgramFiles32) предоставит вам каталог 32-битных программных файлов.

8 голосов
/ 27 июня 2009

Попробуйте "$(MSBuildExtensionsPath32)\.."

4 голосов
/ 06 декабря 2008

Я думаю, что более надежным способом является получение переменной Environment "ProgramFiles (x86)". В 64-битном процессе в Windows это будет указывать на каталог 32-битных программных файлов. Он будет пуст в 32-битной версии Windows, и я верю в процессе wow64

Недавно я столкнулся с практически такой же проблемой с некоторыми скриптами PowerShell. Я написал запись в блоге о том, как решить проблему с каталогом программных файлов. Разумеется, на другом языке, но он может вам помочь.

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

1 голос
/ 15 июля 2013

Если вы запускаете 32-разрядную версию инструментов Visual Studio (особенно в VS2012, вы можете выбрать из 3 разных командных подсказок), $ (ProgramFiles) указывает на «Program Files (x86)»

1 голос
/ 26 марта 2010

Я наткнулся на этот вопрос, пытаясь найти общий способ в MSbuild, чтобы увидеть, была ли это 32- или 64-битная ОС. В случае, если кто-то еще обнаружит это, я использовал следующее:

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

Очевидно, %ProgramW6432% устанавливается только в 64-битных системах.

...