質問

64 ビット版の Windows では、32 ビット ソフトウェアは「c:\program files (x86)」にインストールされます。これは、$(programfiles) を使用して (32 ビット) ソフトウェアへのパスを取得できないことを意味します。したがって、MSBuild プロジェクトでこれを克服するには $(ProgramFiles32) が必要です。実行している OS に応じてプロジェクトを変更したくありません。

解決策はあるので投稿しますが、もっと簡単/より良い方法があるかもしれません。

役に立ちましたか?

解決

MSBuild 4.0 以降には、 ある $(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:\プログラムファイル(x86の)は、」これは64ビットOSであるasumeそれは、存在する場合は、存在しています。それ以外の場合は、通常のプログラムファイルのディレクトリを使用します:

<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)\.."

試してみてください

私はslighly、より信頼性の高い方法は、環境変数「PROGRAMFILES(x86の)」をつかむことだと思います。 Windows上の64ビットプロセスでは、これは32ビットのプログラムファイルディレクトリを指します。これは、Windowsの32ビット版に空になり、私は に信じるWOW64プロセスの

私はいくつかのPowerShellスクリプトで最近ほぼ同じ問題に遭遇しました。私は、プログラムファイルのディレクトリの問題を中心に仕事をどのようにブログのエントリを書きました。明らかに異なる言語が、それはあなたを助けることがあります。

<のhref = "http://blogs.msdn.com/jaredpar/archive/2008/10/21/program-files-i-just-want-the-32-bit-version.aspx" のrel = "nofollowをnoreferrer"> http://blogs.msdn.com/jaredpar/archive/2008/10/21/program-files-i-just-want-the-32-bit-version.aspxする

私はそれが32ビットまたは64ビットOSだったかどうかを確認するためにMSBuildの中に一般的な方法を見つけようと、この質問に出くわし。他の誰かがまたこれを見つける場合、私は次のように使用します:

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

明らか%ProgramW6432%のみ64ビットシステムで設定されている。

あなたは、Visual Studioツールの32ビット版を実行する場合は、

(特にVS2012で、3種類のコマンドのようにあるあなたの中から選択することができます促し)、$(PROGRAMFILES)「プログラムファイル(x86の)」

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top