1. 程式人生 > >VS 解決方案文件結構分析

VS 解決方案文件結構分析

nbsp 項目文件 需要 管理器 TTT lease new projects build

VS2013 解決方案文件結構分析

Visual Studio 的解決方案文件是一個文本文件,其中的內容不是太復雜,有些時候 Visual Studio 會把這個文件搞亂,理解一下這個文件的結構,對我們處理一些異常情況有所幫助。

# 表示註釋行

版本信息

Microsoft Visual Studio Solution File:用來說明解決方案文件的版本號,12.00 說明是 VS2013 的解決方案文件。

VisualStudioVersion:打開這個解決方案文件需要的 Visual Studio 版本號

MinimumVisualStudioVersion:能夠打開這個解決方案的最低 Visual Studio 版本號。

下面是一個解決方案文件的示例。

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2013
VisualStudioVersion = 12.0.31101.0
MinimumVisualStudioVersion = 10.0.40219.1

項目

解決方案中包含若幹個項目,每個項目有一個 Project 的說明。

Project( 項目在解決方案中的編號=顯示名稱, 實際路徑, 項目唯一標識 )

Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConsoleApplication22", 
"ConsoleApplication22\ConsoleApplication22.csproj",
"{312AC167-D533-4A6C-B5F9-9CBA3280DDD8}" EndProject


項目唯一標識來自項目文件,在 ConsoleApplication22.csproj 文件中可以找到如下說明。

<ProjectGuid>{312AC167-D533-4A6C-B5F9-9CBA3280DDD8}</ProjectGuid>

解決方案文件夾

如果是解決方案文件夾, 則實際路徑與顯示名稱一致。

比如,在解決方案中創建了一個名為 NewFolder1 的解決方案文件夾。

技術分享

在解決方案文件中就會多出來一個特殊的 Project。

Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NewFolder1", 
"NewFolder1",
"{86426712-B46D-4FBB-B5CD-28376414DD94}" EndProject

所以,我們可以理解為什麽解決方案文件夾不能嵌套了。


如果我們在解決方案文件夾中創建了一個項目。

技術分享

項目的說明示例如下。

Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ClassLibrary1", 
"NewFolder1\ClassLibrary1\ClassLibrary1.csproj",
"{DD66205E-FEB8-42C5-BF26-55A48274E65C}" EndProject

那麽,在解決方案文件中中的 Global 節中,會多出來一個 GlobalSection(NestedProjects) = preSolution

GlobalSection(NestedProjects) = preSolution
    {DD66205E-FEB8-42C5-BF26-55A48274E65C} = {86426712-B46D-4FBB-B5CD-28376414DD94}
EndGlobalSection

你會看到前面是項目的標識,等號的後面就是解決方案文件夾的標識。這個嵌套的 NestedProjects 用來說明使用解決方案文件夾組織的項目。

Global 配置節

在所有 Project 說明之後,應該存在一個 Global 配置節

技術分享
Global
    GlobalSection(SolutionConfigurationPlatforms) = preSolution
        Debug|Any CPU = Debug|Any CPU
        Release|Any CPU = Release|Any CPU
    EndGlobalSection
    GlobalSection(ProjectConfigurationPlatforms) = postSolution
        {312AC167-D533-4A6C-B5F9-9CBA3280DDD8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
        {312AC167-D533-4A6C-B5F9-9CBA3280DDD8}.Debug|Any CPU.Build.0 = Debug|Any CPU
        {312AC167-D533-4A6C-B5F9-9CBA3280DDD8}.Release|Any CPU.ActiveCfg = Release|Any CPU
        {312AC167-D533-4A6C-B5F9-9CBA3280DDD8}.Release|Any CPU.Build.0 = Release|Any CPU
    EndGlobalSection
    GlobalSection(SolutionProperties) = preSolution
        HideSolutionNode = FALSE
    EndGlobalSection
EndGlobal
技術分享

可以看到有三個部分組成

整個解決方案的配置信息在 SolutionConfigurationPlatforms 中。

GlobalSection(SolutionConfigurationPlatforms) = preSolution
    Debug|Any CPU = Debug|Any CPU
    Release|Any CPU = Release|Any CPU
EndGlobalSection

每個項目的平臺配置信息在 ProjectConfigurationPlatforms 中。

GlobalSection(ProjectConfigurationPlatforms) = postSolution
    {312AC167-D533-4A6C-B5F9-9CBA3280DDD8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
    {312AC167-D533-4A6C-B5F9-9CBA3280DDD8}.Debug|Any CPU.Build.0 = Debug|Any CPU
    {312AC167-D533-4A6C-B5F9-9CBA3280DDD8}.Release|Any CPU.ActiveCfg = Release|Any CPU
    {312AC167-D533-4A6C-B5F9-9CBA3280DDD8}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection

項目的屬性。

GlobalSection(SolutionProperties) = preSolution
    HideSolutionNode = FALSE
EndGlobalSection

TFS 中特殊的 Global 配置節

如果使用 TFS 來管理項目,在 Global 配置節中會多出來一個 GlobalSection(TeamFoundationVersionControl) = preSolution 的配置節。

需要註意的是,這個多出來的配置節只能有一個,有的時候 TFS 會錯誤的多添加若幹個,這時候,在打開項目的時候,你應該會看到如下的提示信息。

技術分享

註意解決方案中實際包含的項目數量,多出來的 TeamFoundationVersionControl 配置節中項目數量一般不對。一般來說,保留第一個,將其他的刪除就可以了。

下面是一個配置節的示例。

技術分享
GlobalSection(TeamFoundationVersionControl) = preSolution
    SccNumberOfProjects = 25
    SccEnterpriseProvider = {4CA58AB2-18FA-4F8D-95D4-32DDF27D184C}
    SccTeamFoundationServer = http://tfs.xxxxxxx.com:8080/tfs/xxxxxxx
    SccLocalPath0 = .

    SccProjectUniqueName1 = xxx\\yyy\\zzz.csproj
    SccProjectTopLevelParentUniqueName1 = ttt.sln
    SccProjectName1 = xxx/yyy
    SccLocalPath1 = xxx\\yyy
EndGlobalSection
技術分享

其中

SccNumberOfProjects 是說明在 TFS 管理之下共有多少個項目。
SccTeamFoundationServer:TFS 服務器的地址。

SccLocalPath0:源代碼管理器的本地目錄

具體解決方案中的項目再分別列出來,每個項目占 4 行。

SccProjectUniqueName1:項目的路徑

SccProjectTopLevelParentUniqueName1:就是解決方案的名稱

SccProjectName1:項目的名稱,註意已經包含了項目文件夾前綴

SccLocalPath1:保存在本地的項目路徑

VS 解決方案文件結構分析