Вопрос

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

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

Это было полезно?

Решение

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

Если это не так, и вам нужно что-то, что может выполнять правильные действия даже при выполнении в среде 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>

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

Другие советы

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

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

В MSBuild 4.0, $(MSBuildProgramFiles32) предоставит вам 32-разрядный каталог Program Files.

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

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

Недавно я столкнулся практически с такой же проблемой с некоторыми сценариями PowerShell.Я написал запись в блоге о том, как a решал проблему с каталогом program files.Очевидно, что это другой язык, но это может вам помочь.

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

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

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

По - видимому %ProgramW6432% устанавливается только в 64-разрядных системах.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top