Файл решения (.sln)

Решение — это структура для организации проектов в Visual Studio. Решение поддерживает сведения о состоянии проектов в двух файлах:

  • .sln файл (текстовый, общий)

  • .suo file (двоичные параметры решения для конкретного пользователя)

Дополнительные сведения о файлах SUO см. в файле параметров пользователя решения (SUO).

Если VSPackage загружается из-за ссылки на .sln файл, среда вызывает ReadSolutionProps чтение в .sln файле.

Файл .sln содержит текстовые сведения, используемые средой для поиска и загрузки параметров "имя-значение" для сохраненных данных, а проект VSPackage ссылается на него. Когда пользователь открывает решение, среда циклит по preSolutionфайлу Projectи postSolution сведения в .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]. Значение по умолчанию ключей — это GUID пакета (REG_SZ) VSPackage, написавшее записи.

  2. Среда загружает VSPackage, вызывает QueryInterface VSPackage для IVsPersistSolutionProps интерфейса и вызывает 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 файл. Значение NULL, переданное в QuerySaveSolutionPropsVSQUERYSAVESLNPROPS, указывает, что данные сохраняются для решения. Если значение не равно NULL, сохраненные сведения относятся к конкретному проекту, определенному указателем на IVsHierarchy интерфейс.

При сохранении IVsSolutionPersistence сведений интерфейс вызывается с указателем на SaveSolutionProps метод. Затем WriteSolutionProps метод вызывается средой для получения пар "имя-значение" из IPropertyBag интерфейса и записи сведений в .sln файл.

SaveSolutionProps и WriteSolutionProps объекты вызываются рекурсивно средой, чтобы получить информацию, которая будет сохранена из IPropertyBag интерфейса до тех пор, пока все изменения не будут введены в .sln файл. Таким образом, вы можете убедиться, что информация будет сохранена в решении и доступна при следующем открытии решения.

Каждый загруженный VSPackage перечисляется, чтобы узнать, есть ли что-либо для сохранения в .sln файле. Это только во время загрузки, когда запрашиваются разделы реестра. Среда знает обо всех загруженных пакетах, так как они находятся в памяти во время сохранения решения.

.sln Только файл содержит записи в preSolution разделах и postSolution разделах. Аналогичные разделы в suo-файле отсутствуют, так как решение должно правильно загрузить эту информацию. Файл .suo содержит параметры, относящиеся к пользователю, такие как частные заметки, которые не предназначены для общего доступа или размещения в элементе управления исходным кодом.