2010-11-04 39 views
0

我目前正在開發一個控制檯應用程序,它將傳遞一個vcxproj文件並使用GCC進行編譯。不幸的是,我很快就遇到了一大堆問題。解析VS2010 MSBuild vcxproj文件

我發現了一堆目錄的快捷方式,如:

VCTargetsPath
VCInstallDir
SolutionDir
PROJECTDIR
UserRootDir

等。

MSBuild從哪裏獲取這些值?我認爲它們是爲MSBuild過程設置的環境變量(最後一個已知的環境變量以相同的方式處理,即「$(...)」)。這是一個糟糕的假設,所以我仍然想知道我是如何得到這些的。有沒有人有這個想法?

任何信息,將不勝感激:)

回答

3

MSBuild可執行文件(和依賴DLL)以與處理構建文件中其他任何屬性相同的方式處理這些屬性。在這種情況下,它們只是它明確查找的預定義屬性。

如果您真的想深入研究,請在Reflector中打開Microsoft.Build.dll並查找Microsoft.Build.Construction.SolutionProjectGenerator.AddGlobalProperties(...)方法,以瞭解它是如何處理一些衆所周知的屬性的。

作爲附加說明,請確保您完全導航導入指令並處理每個導入的屬性和項值的覆蓋。有許多屬性和項目是Visual Studio構建的一部分,對於您的代碼正確編譯而言並不總是必需的。

+0

歡呼這是非常有趣的信息。不過,我應該指出,我並不是真的渴望掛鉤MSBuild並插入我自己的構建方法。我純粹試圖解析vcxproj文件以從使用GCC(而不是MSVC)的那些代碼生成我自己的代碼。 ..我不完全確定反射信息如何幫助我...目前,我正在使用「NMAKE」構建,並通過我自己的應用程序,然後解析sln和vcproj,最後生成GCC構建的代碼。這個想法是我可以從VSttudio其他平臺上構建,包括Android和MacOSX。 – Goz 2010-11-04 20:16:08

+0

有趣的是,它似乎是唯一沒有預先定義的是「VCTargetsPath」和MSBuild特定負載。其餘的幾乎都可以在各種.props文件中找到。 MSBuild的是在MSDN中定義的,VCTargetsPath是在註冊表中定義的。 – Goz 2010-11-07 12:30:31

2

我相信這些都是依賴於Visual Studio的宏:MSDN

+0

我很清楚這一點。但看到MSbuild可以抓住他們..這意味着我必須能夠......如何? – Goz 2010-11-04 17:16:19

2

他們中的一些是由你的文件的位置定義

  • SolutionDir - 包含此項目的解決方案(.sln)文件的目錄
  • ProjectDir - 包含項目文件的目錄(.vcproj,.vcxproj)

其它的通過MSVC的位置界定安裝

  • VCInstallDir - 安裝的Visual Studio的Visual C部分。即。 C:\Program Files\Microsoft Visual Studio 8\VC

等等,並且會根據您加載的內容在msbuild內部。