方案 (.sln) 檔案
方案是一種在 Visual Studio 中組織專案的結構。 此方案在兩個檔案中維護專案的狀態資訊:
.sln
檔案 (以文字為基礎,共用).suo
檔案 (二進位,使用者特定解決方案選項)
如需 .suo 檔案的詳細資訊,請參閱方案使用者選項 (.suo) 檔案。
如果您的 VSPackage 由於在 .sln
檔案中被參考而被載入,則環境會呼叫 ReadSolutionProps 來讀取 .sln
檔案。
.sln
檔案包含以文字為基礎的資訊,環境會用來這些資訊來尋找和載入保存資料的名稱-值參數,以及它參考的專案 VSPackage。 當使用者開啟方案時,環境會循環查看 .sln
檔案中的 preSolution
、Project
和 postSolution
資訊,以載入方案、方案內的專案,以及附加至方案的任何保存資訊。
每個專案的檔案都包含環境讀取的其他資訊,以使用該專案的項目填入階層。 階層資料持續性是由專案所控制。 資料通常不會儲存在 .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
為了載入方案,環境會執行以下工作順序:
環境會讀取
.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)。環境會載入 VSPackage、呼叫 IVsPersistSolutionProps 介面的 VSPackage 中的
QueryInterface
,並使用區段中的資料呼叫 ReadSolutionProps 方法,以便 VSPackage 可以儲存資料。 環境對每個preSolution
區段重複此程序。環境會逐一查看專案持續性區塊。 在此情況下,有一個專案。
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。
每個專案都可以保存唯一的專案執行項目識別碼,以便方案中的其他專案視需要進行存取。 在理想情況下,如果方案和專案位於原始程式碼控制之下,則專案的路徑應該相對於方案的路徑。 第一次載入方案時,專案檔案不能位於使用者的機器上。 藉由將儲存在相對於方案檔案之伺服器上的專案檔案,可以更容易找到專案檔案並複製到使用者的機器。 然後,它複製並載入專案所需的其餘檔案。
根據
.sln
檔案專案區段所包含的資訊,環境會載入每個專案檔案。 接著,專案本身會負責填入專案階層並載入任何巢狀專案。處理完
.sln
檔案的所有區段後,方案將顯示在 [方案總管] 中,並可供使用者修改。
如果實作 VSPackage 的方案中的任何專案無法載入,則會呼叫 OnProjectLoadFailure 方法,且方案中的所有專案都會忽略在載入期間可能進行的變更。 對於任何剖析錯誤,方案檔案會保留盡可能多的資訊。 環境會顯示對話方塊,警告使用者方案已損毀。
儲存或關閉方案時,會呼叫 QuerySaveSolutionProps 方法。 它會傳遞至階層,以查看是否已變更需要輸入 .sln
檔案的方案。 傳遞給 VSQUERYSAVESLNPROPS 中的 QuerySaveSolutionProps
之 Null 值表示正在儲存方案的資訊。 如果值不是 Null,則持久性資訊適用於特定專案,由 IVsHierarchy 介面的指標決定。
如果有要儲存的資訊,則會使用指向 SaveSolutionProps 方法的指標呼叫 IVsSolutionPersistence 介面。 然後,環境呼叫 WriteSolutionProps 方法,從 IPropertyBag
介面擷取名稱-值組,並將資訊寫入 .sln
檔案。
環境會以遞歸方式呼叫 SaveSolutionProps
和 WriteSolutionProps
物件,以擷取要從 IPropertyBag
介面儲存的資訊,直到所有變更都輸入檔案 .sln
為止。 如此一來,您就可以確保資訊會與方案一起保存,並在下次開啟方案時提供。
列舉每個載入的 VSPackage,以查看是否有任何內容要儲存至 .sln
檔案。 只有在載入時才會查詢登錄機碼。 環境知道所有已載入的套件,因為它們在儲存方案時位於記憶體中。
只有 .sln
檔案包含 preSolution
和 postSolution
區段中的項目。 .suo 檔案中沒有類似的區段,因為方案需要此資訊才能正確載入。 .suo
檔案包含使用者特定的選項,例如:不打算共用或放置於原始程式碼控制下的私人附註。