方案 (.sln) 檔案

方案是一種在 Visual Studio 中組織專案的結構。 此方案在兩個檔案中維護專案的狀態資訊:

  • .sln 檔案 (以文字為基礎,共用)

  • .suo 檔案 (二進位,使用者特定解決方案選項)

如需 .suo 檔案的詳細資訊,請參閱方案使用者選項 (.suo) 檔案

如果您的 VSPackage 由於在 .sln 檔案中被參考而被載入,則環境會呼叫 ReadSolutionProps 來讀取 .sln 檔案。

.sln 檔案包含以文字為基礎的資訊,環境會用來這些資訊來尋找和載入保存資料的名稱-值參數,以及它參考的專案 VSPackage。 當使用者開啟方案時,環境會循環查看 .sln 檔案中的 preSolutionProjectpostSolution 資訊,以載入方案、方案內的專案,以及附加至方案的任何保存資訊。

每個專案的檔案都包含環境讀取的其他資訊,以使用該專案的項目填入階層。 階層資料持續性是由專案所控制。 資料通常不會儲存在 .sln 檔案中,不過如果您選擇這麼做,您可以刻意將專案資訊寫入 .sln 檔案。 如需持續性的詳細資訊,請參閱專案持續性開啟和儲存專案項目

檔案標頭

.sln 檔案的標頭如下所示:

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.28701.123
MinimumVisualStudioVersion = 10.0.40219.1
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.2.32505.173
MinimumVisualStudioVersion = 10.0.40219.1

定義

Microsoft Visual Studio Solution File, Format Version 12.00
定義檔案格式版本的標準標頭。

# Visual Studio Version 16
(最近) 儲存此方案檔案的 Visual Studio 主要版本。 此資訊會控制方案圖示中的版本號碼。

VisualStudioVersion = 16.0.28701.123
(最近) 儲存方案檔案的 Visual Studio 完整版本。 如果方案檔案是由具有相同主要版本的較新 Visual Studio 版本所儲存。 此值不會更新,以減少檔案中的變動。

MinimumVisualStudioVersion = 10.0.40219.1
可以開啟此方案檔案的 Visual Studio 最低 (最舊) 版本。

Microsoft Visual Studio Solution File, Format Version 12.00
定義檔案格式版本的標準標頭。

# Visual Studio Version 17
(最近) 儲存此方案檔案的 Visual Studio 主要版本。 此資訊會控制方案圖示中的版本號碼。

VisualStudioVersion = 17.2.32505.173
(最近) 儲存方案檔案的 Visual Studio 完整版本。 如果方案檔案是由具有相同主要版本的較新 Visual Studio 版本所儲存。 此值不會更新,以減少檔案中的變動。

MinimumVisualStudioVersion = 10.0.40219.1
可以開啟此方案檔案的 Visual Studio 最低 (最舊) 版本。

檔案正文

.sln 檔案的主體是由幾個標示為 GlobalSection 的區段組成,如下所示:

Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "Project1", "Project1.vbproj", "{8CDD8387-B905-44A8-B5D5-07BB50E05BEA}"
EndProject
Global
  GlobalSection(SolutionNotes) = postSolution
  EndGlobalSection
  GlobalSection(SolutionConfiguration) = preSolution
       ConfigName.0 = Debug
       ConfigName.1 = Release
  EndGlobalSection
  GlobalSection(ProjectDependencies) = postSolution
  EndGlobalSection
  GlobalSection(ProjectConfiguration) = postSolution
   {8CDD8387-B905-44A8-B5D5-07BB50E05BEA}.Debug.ActiveCfg = Debug|x86
   {8CDD8387-B905-44A8-B5D5-07BB50E05BEA}.Debug.Build.0 = Debug|x86
   {8CDD8387-B905-44A8-B5D5-07BB50E05BEA}.Release.ActiveCfg = Release|x86
   {8CDD8387-B905-44A8-B5D5-07BB50E05BEA}.Release.Build.0 = Release|x86
  EndGlobalSection
  GlobalSection(ExtensibilityGlobals) = postSolution
  EndGlobalSection
  GlobalSection(ExtensibilityAddIns) = postSolution
  EndGlobalSection
EndGlobal

為了載入方案,環境會執行以下工作順序:

  1. 環境會讀取 .sln 檔案的全域區段,並處理標示為 preSolution 的所有區段。 在此範例檔案中,有一個這類的陳述式:

    GlobalSection(SolutionConfiguration) = preSolution
         ConfigName.0 = Debug
         ConfigName.1 = Release
    

    當環境讀取 GlobalSection('name') 標籤時,它會使用登錄將名稱對應至 VSPackage。 機碼名稱應該存在於 [HKLM\\<Application ID Registry Root\>\SolutionPersistence\AggregateGUIDs] 底下的登錄。 機碼的預設值是撰寫項目之 VSPackage 的套件 GUID (REG_SZ)。

  2. 環境會載入 VSPackage、呼叫 IVsPersistSolutionProps 介面的 VSPackage 中的 QueryInterface,並使用區段中的資料呼叫 ReadSolutionProps 方法,以便 VSPackage 可以儲存資料。 環境對每個 preSolution 區段重複此程序。

  3. 環境會逐一查看專案持續性區塊。 在此情況下,有一個專案。

    Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "Project1",
    "Project1.vbproj", "{8CDD8387-B905-44A8-B5D5-07BB50E05BEA}"
    EndProject
    

    此陳述式包含唯一的專案 GUID 和專案類型 GUID。 環境使用此資訊來尋找屬於方案的專案檔案或檔案,以及每個專案所需的 VSPackage。 專案 GUID 會傳遞至 IVsProjectFactory 以載入與專案相關的特定 VSPackage,然後由 VSPackage 載入專案。 在此情況下,為此專案載入的 VSPackage 為 Visual Basic。

    每個專案都可以保存唯一的專案執行項目識別碼,以便方案中的其他專案視需要進行存取。 在理想情況下,如果方案和專案位於原始程式碼控制之下,則專案的路徑應該相對於方案的路徑。 第一次載入方案時,專案檔案不能位於使用者的機器上。 藉由將儲存在相對於方案檔案之伺服器上的專案檔案,可以更容易找到專案檔案並複製到使用者的機器。 然後,它複製並載入專案所需的其餘檔案。

  4. 根據 .sln 檔案專案區段所包含的資訊,環境會載入每個專案檔案。 接著,專案本身會負責填入專案階層並載入任何巢狀專案。

  5. 處理完 .sln 檔案的所有區段後,方案將顯示在 [方案總管] 中,並可供使用者修改。

如果實作 VSPackage 的方案中的任何專案無法載入,則會呼叫 OnProjectLoadFailure 方法,且方案中的所有專案都會忽略在載入期間可能進行的變更。 對於任何剖析錯誤,方案檔案會保留盡可能多的資訊。 環境會顯示對話方塊,警告使用者方案已損毀。

儲存或關閉方案時,會呼叫 QuerySaveSolutionProps 方法。 它會傳遞至階層,以查看是否已變更需要輸入 .sln 檔案的方案。 傳遞給 VSQUERYSAVESLNPROPS 中的 QuerySaveSolutionProps 之 Null 值表示正在儲存方案的資訊。 如果值不是 Null,則持久性資訊適用於特定專案,由 IVsHierarchy 介面的指標決定。

如果有要儲存的資訊,則會使用指向 SaveSolutionProps 方法的指標呼叫 IVsSolutionPersistence 介面。 然後,環境呼叫 WriteSolutionProps 方法,從 IPropertyBag 介面擷取名稱-值組,並將資訊寫入 .sln 檔案。

環境會以遞歸方式呼叫 SaveSolutionPropsWriteSolutionProps 物件,以擷取要從 IPropertyBag 介面儲存的資訊,直到所有變更都輸入檔案 .sln 為止。 如此一來,您就可以確保資訊會與方案一起保存,並在下次開啟方案時提供。

列舉每個載入的 VSPackage,以查看是否有任何內容要儲存至 .sln 檔案。 只有在載入時才會查詢登錄機碼。 環境知道所有已載入的套件,因為它們在儲存方案時位於記憶體中。

只有 .sln 檔案包含 preSolutionpostSolution 區段中的項目。 .suo 檔案中沒有類似的區段,因為方案需要此資訊才能正確載入。 .suo 檔案包含使用者特定的選項,例如:不打算共用或放置於原始程式碼控制下的私人附註。