2011-08-15 129 views
9

我寫了一個自定義MSBuild任務,調用SubWCRev.exe,一個可執行文件(通常)駐留在C:\Program Files\TortoiseSVN\bin,無論是32位還是64位,因爲TortoiseSVN提供了兩個版本。

問題是,Visual Studio 2010只有32位版本。所以當我的一個64位的盒子的同事嘗試使用我的閃亮的新任務來構建時,$(ProgramFiles)解析爲C:\Program Files(x86),並且它爆炸說SubWCRev.exe找不到。因爲他們有64位版本的TortoiseSVN,它生活在C:\Program Files

在我的msbuild腳本中是否有比硬編碼C:\Program Files更好的解決方案,還是讓每個人都使用32位版本的TortoiseSVN? (其實這是一個C#項目,我用MSBuild代碼修了一下)

回答

14

看看它這:

<Project ToolsVersion="4.0" DefaultTargets="PrintValues" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 

    <Target Name="PrintValues"> 
    <PropertyGroup> 
     <MyProgramFiles>$(ProgramW6432)</MyProgramFiles> 
     <MyProgramFiles Condition="$(MyProgramFiles) == ''">$(ProgramFiles)</MyProgramFiles> 
    </PropertyGroup> 

    <Message Text="MyProgramFiles: $(MyProgramFiles)"/> 
    </Target> 

</Project> 

這使MyProgramFiles可以解析32位和64位Windows的「C:\ Program Files」(ProgramW6432環境變量在非64位版本的Windows上爲空)。

+0

馬上工作!非常感謝 –

1

使用MSBuildExtensionsPath屬性而不是硬編碼路徑。

MSDN

下的\ Program Files文件\或\ Program Files文件 (x86)的文件夾的子文件夾的MSBuild。此路徑始終指向與您當前正在運行的窗口位置相同的 的程序文件。例如,對於64位機器上的32位窗口,路徑指向Program Files (x86)夾。對於64位機器上的64位窗口,路徑爲 Program Files文件夾。另請參閱MSBuildExtensionsPath32和 MSBuildExtensionsPath64。

編輯:要到64位SVN文件夾,使用:

<PropertyGroup> 
    <TortoiseSVNPath>$(MSBuildExtensionsPath64)\..\TortoiseSVN\bin</TortoiseSVNPath> 
</PropertyGroup> 

另一種方法是檢查文件夾的存在:

<PropertyGroup> 
    <TortoiseSVNPath Condition="Exists('$(PROGRAMFILES) (x86)')">$(PROGRAMFILES) (x86)\TortoiseSVN\bin</TortoiseSVNPath> 
    <TortoiseSVNPath Condition="$(TortoiseSVNPath) == ''">$(PROGRAMFILES)\TortoiseSVN\bin</TortoiseSVNPath> 
</PropertyGroup> 
+0

對不起,我試過了,它解析爲C:\ Program Files(x86)\ MSBuild。我確信它是一個Windows 7 64位盒,而Visual Studio是一個32位的進程(只需使用Process Explorer進行檢查)。 –

+0

這是正確的行爲。對於32位VS,它應該解析爲'C:\ Program Files(x86)...'。 MSBuild最後是你的問題嗎? '$(MSBuildExtensionsPath)\ ..'會給出正確的'Program Files'文件夾。 – Mrchief

+0

@dario_ramos:查看我的更新答案的例子。 – Mrchief