Lösungsdatei (.sln)

Eine Projektmappe ist eine Struktur zum Organisieren von Projekten in Visual Studio. Die Lösung Standard enthält die Statusinformationen für Projekte in zwei Dateien:

  • .sln Datei (textbasiert, freigegeben)

  • .suo Datei (binäre, benutzerspezifische Lösungsoptionen)

Weitere Informationen zu SUO-Dateien finden Sie unter Solution User Options (.suo) File.

Wenn Ihr VSPackage aufgrund des Verweises in der .sln Datei geladen wird, ruft die Umgebung das Lesen in der .sln Datei aufReadSolutionProps.

Die .sln Datei enthält textbasierte Informationen, die die Umgebung zum Suchen und Laden der Namenswertparameter für die gespeicherten Daten verwendet, und das Projekt VSPackages verweist. Wenn ein Benutzer eine Lösung öffnet, wechselt die Umgebung durch die preSolutionDatei Projectund postSolution die Informationen in der .sln Datei, um die Lösung, Projekte in der Lösung und alle dauerhaften Informationen zu laden, die an die Lösung angefügt sind.

Die Datei jedes Projekts enthält zusätzliche Informationen, die von der Umgebung gelesen werden, um die Hierarchie mit den Elementen dieses Projekts aufzufüllen. Die Hierarchiedatenpersistenz wird vom Projekt gesteuert. Die Daten werden normalerweise nicht in der .sln Datei gespeichert, obwohl Sie Projektinformationen absichtlich in die .sln Datei schreiben können, wenn Sie dies tun. Weitere Informationen zur Persistenz finden Sie unter Projektpersistenz und Öffnen und Speichern von Projektelementen.

Dateiheader

Der Header einer .sln Datei sieht wie folgt aus:

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

Definitionen

Microsoft Visual Studio Solution File, Format Version 12.00
Standardheader, der die Dateiformatversion definiert.

# Visual Studio Version 16
Die Hauptversion von Visual Studio, die (zuletzt) diese Lösungsdatei gespeichert hat. Diese Informationen steuern die Versionsnummer im Lösungssymbol.

VisualStudioVersion = 16.0.28701.123
Die Vollversion von Visual Studio, die (zuletzt) die Projektmappendatei gespeichert hat. Wenn die Lösungsdatei von einer neueren Version von Visual Studio gespeichert wird, die dieselbe Hauptversion aufweist. Dieser Wert wird nicht aktualisiert, sodass die Änderung in der Datei verringert wird.

MinimumVisualStudioVersion = 10.0.40219.1
Die minimale (älteste) Version von Visual Studio, die diese Lösungsdatei öffnen kann.

Microsoft Visual Studio Solution File, Format Version 12.00
Standardheader, der die Dateiformatversion definiert.

# Visual Studio Version 17
Die Hauptversion von Visual Studio, die (zuletzt) diese Lösungsdatei gespeichert hat. Diese Informationen steuern die Versionsnummer im Lösungssymbol.

VisualStudioVersion = 17.2.32505.173
Die Vollversion von Visual Studio, die (zuletzt) die Projektmappendatei gespeichert hat. Wenn die Lösungsdatei von einer neueren Version von Visual Studio gespeichert wird, die dieselbe Hauptversion aufweist. Dieser Wert wird nicht aktualisiert, sodass die Änderung in der Datei verringert wird.

MinimumVisualStudioVersion = 10.0.40219.1
Die minimale (älteste) Version von Visual Studio, die diese Lösungsdatei öffnen kann.

Dateitext

Der Textkörper einer .sln Datei besteht aus mehreren Abschnitten, die wie folgt bezeichnet werden 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

Zum Laden einer Lösung führt die Umgebung die folgende Aufgabensequenz aus:

  1. Die Umgebung liest den globalen Abschnitt der .sln Datei und verarbeitet alle markierten preSolutionAbschnitte. In dieser Beispieldatei gibt es eine solche Anweisung:

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

    Wenn die Umgebung das GlobalSection('name') Tag liest, wird der Name einem VSPackage mithilfe der Registrierung zugeordnet. Der Schlüsselname sollte in der Registrierung unter [HKLM\\<Application ID Registry Root\>\SolutionPersistence\AggregateGUIDs]. Der Standardwert der Schlüssel ist die Paket-GUID (REG_SZ) der VSPackage, die die Einträge geschrieben hat.

  2. Die Umgebung lädt vsPackage, ruft QueryInterface die VSPackage für die IVsPersistSolutionProps Schnittstelle auf und ruft die ReadSolutionProps Methode mit den Daten im Abschnitt auf, damit die VSPackage die Daten speichern kann. Die Umgebung wiederholt diesen Prozess für jeden preSolution Abschnitt.

  3. Die Umgebung durchläuft die Persistenzblöcke des Projekts. In diesem Fall gibt es ein Projekt.

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

    Diese Anweisung enthält die eindeutige Projekt-GUID und die Projekttyp-GUID. Diese Informationen werden von der Umgebung verwendet, um die Projektdatei oder -dateien zu finden, die zur Lösung gehören, und das für jedes Projekt erforderliche VSPackage. Die Projekt-GUID wird übergeben, um IVsProjectFactory das spezifische VSPackage-Projekt im Zusammenhang mit dem Projekt zu laden. Anschließend wird das Projekt vom VSPackage geladen. In diesem Fall ist das für dieses Projekt geladene VSPackage Visual Basic.

    Jedes Projekt kann eine eindeutige Projektinstanz-ID beibehalten, sodass sie bei Bedarf von anderen Projekten in der Projektmappe aufgerufen werden kann. Im Idealfall sollte der Pfad zum Projekt relativ zum Pfad der Lösung relativ zum Pfad der Lösung sein, wenn die Projektmappe und Projekte unter Quellcodeverwaltung stehen. Wenn die Projektmappe zum ersten Mal geladen wird, können sich die Projektdateien nicht auf dem Computer des Benutzers befinden. Wenn die Projektdatei, die relativ zur Projektmappendatei auf dem Server gespeichert ist, ist es einfacher, dass die Projektdatei gefunden und auf den Computer des Benutzers kopiert wird. Anschließend werden die restlichen Dateien kopiert und geladen, die für das Projekt erforderlich sind.

  4. Basierend auf den Informationen, die im Projektabschnitt der .sln Datei enthalten sind, lädt die Umgebung jede Projektdatei. Das Projekt selbst ist dann für das Auffüllen der Projekthierarchie und das Laden von geschachtelten Projekten verantwortlich.

  5. Nachdem alle Abschnitte der .sln Datei verarbeitet wurden, wird die Lösung in Projektmappen-Explorer angezeigt und kann vom Benutzer geändert werden.

Wenn ein Projekt in der Projektmappe, das VSPackage implementiert, nicht geladen werden kann, wird die OnProjectLoadFailure Methode aufgerufen, und alle Projekte in der Lösung ignorieren Änderungen, die sie beim Laden möglicherweise vorgenommen haben. Für alle Analysefehler werden so viele Informationen wie möglich mit den Lösungsdateien beibehalten. In der Umgebung wird ein Dialogfeld angezeigt, in dem der Benutzer gewarnt wird, dass die Lösung beschädigt ist.

Wenn die Lösung gespeichert oder geschlossen wird, wird die QuerySaveSolutionProps Methode aufgerufen. Es wird an die Hierarchie übergeben, um festzustellen, ob Änderungen an der Lösung vorgenommen wurden, die in die .sln Datei eingegeben werden müssen. Ein NULL-Wert, der an QuerySaveSolutionProps das In VSQUERYSAVESLNPROPSübergeben wird, gibt an, dass Informationen für die Lösung beibehalten werden. Wenn der Wert nicht NULL ist, sind die dauerhaften Informationen für ein bestimmtes Projekt bestimmt, das vom Zeiger auf die IVsHierarchy Schnittstelle bestimmt wird.

Wenn Informationen gespeichert werden sollen, wird die IVsSolutionPersistence Schnittstelle mit einem Zeiger auf die SaveSolutionProps Methode aufgerufen. Die WriteSolutionProps Methode wird dann von der Umgebung aufgerufen, um die Name-Wert-Paare aus der IPropertyBag Schnittstelle abzurufen und die Informationen in die .sln Datei zu schreiben.

SaveSolutionProps und WriteSolutionProps Objekte werden rekursiv von der Umgebung aufgerufen, um Informationen abzurufen, die von der IPropertyBag Schnittstelle gespeichert werden sollen, bis alle Änderungen in die .sln Datei eingegeben wurden. Auf diese Weise können Sie sicherstellen, dass die Informationen mit der Lösung beibehalten und beim nächsten Öffnen der Lösung verfügbar sind.

Jedes geladene VSPackage wird aufgezählt, um festzustellen, ob etwas zum Speichern in .sln der Datei vorhanden ist. Die Registrierungsschlüssel werden nur beim Laden abgefragt. Die Umgebung kennt alle geladenen Pakete, da sie sich zum Zeitpunkt des Speicherns der Lösung im Arbeitsspeicher befinden.

Nur die .sln Datei enthält Einträge in den preSolution Und postSolution Abschnitten. Es gibt keine ähnlichen Abschnitte in der SUO-Datei, da die Lösung diese Informationen benötigt, um ordnungsgemäß zu laden. Die .suo Datei enthält benutzerspezifische Optionen wie private Notizen, die nicht freigegeben oder unter Quellcodeverwaltung platziert werden sollen.