解决方案 (.sln) 文件

解决方案是用于在 Visual Studio 中组织项目的结构。 该解决方案维护两个文件中项目的状态信息:

  • .sln 文件(基于文本、共享)

  • .suo 文件 (二进制,特定于用户的解决方案选项)

有关 .suo 文件的详细信息,请参阅 解决方案用户选项 (.suo) 文件

如果 VSPackage 由于在 .sln 文件中被引用而加载,则环境将调用 ReadSolutionProps.sln 文件中读取。

该文件 .sln 包含环境用来查找和加载持久化数据的名称和项目 VSPackage 所引用的基于文本的信息。 当用户打开解决方案时,环境会循环preSolutionProjectpostSolution访问文件中的信息.sln,以加载解决方案、解决方案中的项目以及附加到解决方案的任何持久化信息。

每个项目的文件都包含环境读取的其他信息,以使用该项目的项填充层次结构。 层次结构数据暂留由项目控制。 数据通常不会存储在 .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。

    每个项目都可以保留唯一的项目实例 ID,以便解决方案中的其他项目根据需要访问它。 理想情况下,如果解决方案和项目在源代码控制下,则项目的路径应相对于解决方案的路径。 首次加载解决方案时,项目文件不能位于用户的计算机上。 通过将存储在相对于解决方案文件的服务器上的项目文件,可以更轻松地找到项目文件并将其复制到用户的计算机上。 然后,它会复制并加载项目所需的其余文件。

  4. 根据文件的项目部分 .sln 中包含的信息,环境将加载每个项目文件。 然后,项目本身负责填充项目层次结构并加载任何嵌套项目。

  5. 处理文件的所有部分.sln后,解决方案会显示在解决方案资源管理器中,并可供用户修改。

如果实现 VSPackage 的解决方案中的任何项目无法加载,则会调用该方法, OnProjectLoadFailure 并且解决方案中的所有项目都会忽略它在加载过程中可能所做的更改。 对于任何分析错误,解决方案文件会保留尽可能多的信息。 环境显示一个对话框,警告用户解决方案已损坏。

保存或关闭解决方案时, QuerySaveSolutionProps 将调用该方法。 它传递到层次结构,以查看是否已对需要输入 .sln 到文件中的解决方案进行更改。 传入的 QuerySaveSolutionPropsVSQUERYSAVESLNPROPSnull 值指示正在为解决方案保留信息。 如果该值不为 null,则持久化的信息由指向接口的 IVsHierarchy 指针确定的特定项目。

如果有要保存的信息,则会 IVsSolutionPersistence 使用指向该方法的 SaveSolutionProps 指针调用接口。 然后,环境 WriteSolutionProps 会调用该方法,以便从 IPropertyBag 接口中检索名称/值对,并将信息 .sln 写入文件。

SaveSolutionProps 环境 WriteSolutionProps 以递归方式调用对象,以检索要从 IPropertyBag 接口保存的信息,直到所有更改都输入到 .sln 文件中。 这样,就可以确保信息将随解决方案一起持久保存,并在下次打开解决方案时可用。

将枚举每个已加载的 VSPackage,以查看它是否有要保存到 .sln 文件的任何内容。 仅在加载时查询注册表项。 环境知道所有已加载的包,因为它们在保存解决方案时处于内存中。

.sln只有文件包含节preSolutionpostSolution中的条目。 .suo 文件中没有类似的部分,因为解决方案需要此信息才能正确加载。 该文件 .suo 包含用户特定的选项,例如不打算共享或放置在源代码控制下的专用笔记。