Plik rozwiązania (.sln)

Rozwiązanie to struktura organizowania projektów w programie Visual Studio. Rozwiązanie obsługuje informacje o stanie projektów w dwóch plikach:

  • .sln plik (oparty na tekście, udostępniony)

  • .suo file (binarne, opcje rozwiązania specyficzne dla użytkownika)

Aby uzyskać więcej informacji na temat plików suo, zobacz Plik opcji użytkownika rozwiązania (suo).

Jeśli pakiet VSPackage jest ładowany z powodu przywołowywania do .sln pliku, środowisko wywołuje polecenie ReadSolutionProps odczytu w .sln pliku.

Plik .sln zawiera informacje tekstowe używane przez środowisko do znajdowania i ładowania parametrów name-value dla utrwałych danych i projektu VSPackages, do których się odwołuje. Gdy użytkownik otworzy rozwiązanie, środowisko przechodzi przez preSolutionplik , Projecti postSolution informacje .sln w celu załadowania rozwiązania, projektów w rozwiązaniu i wszelkich trwałych informacji dołączonych do rozwiązania.

Plik każdego projektu zawiera dodatkowe informacje odczytywane przez środowisko w celu wypełnienia hierarchii elementami tego projektu. Trwałość danych hierarchii jest kontrolowana przez projekt. Dane nie są zwykle przechowywane w .sln pliku, chociaż celowo można zapisywać informacje o projekcie w .sln pliku, jeśli zdecydujesz się to zrobić. Aby uzyskać więcej informacji na temat trwałości, zobacz Project Persistence and Opening and Saving Project Items (Trwałość projektu i otwieranie i zapisywanie elementów projektu).

Nagłówek pliku

Nagłówek .sln pliku wygląda następująco:

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

Definicje

Microsoft Visual Studio Solution File, Format Version 12.00
Nagłówek standardowy definiujący wersję formatu pliku.

# Visual Studio Version 16
Główna wersja programu Visual Studio, która (ostatnio) zapisała ten plik rozwiązania. Te informacje steruje numerem wersji w ikonie rozwiązania.

VisualStudioVersion = 16.0.28701.123
Pełna wersja programu Visual Studio, która (ostatnio) zapisała plik rozwiązania. Jeśli plik rozwiązania jest zapisywany przez nowszą wersję programu Visual Studio, która ma tę samą wersję główną. Ta wartość nie jest aktualizowana tak, aby zmniejszyć współczynnik zmian w pliku.

MinimumVisualStudioVersion = 10.0.40219.1
Minimalna (najstarsza) wersja programu Visual Studio, która może otworzyć ten plik rozwiązania.

Microsoft Visual Studio Solution File, Format Version 12.00
Nagłówek standardowy definiujący wersję formatu pliku.

# Visual Studio Version 17
Główna wersja programu Visual Studio, która (ostatnio) zapisała ten plik rozwiązania. Te informacje steruje numerem wersji w ikonie rozwiązania.

VisualStudioVersion = 17.2.32505.173
Pełna wersja programu Visual Studio, która (ostatnio) zapisała plik rozwiązania. Jeśli plik rozwiązania jest zapisywany przez nowszą wersję programu Visual Studio, która ma tę samą wersję główną. Ta wartość nie jest aktualizowana tak, aby zmniejszyć współczynnik zmian w pliku.

MinimumVisualStudioVersion = 10.0.40219.1
Minimalna (najstarsza) wersja programu Visual Studio, która może otworzyć ten plik rozwiązania.

Treść pliku

Treść .sln pliku składa się z kilku sekcji oznaczonych GlobalSectionetykietą , w następujący sposób:

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

Aby załadować rozwiązanie, środowisko wykonuje następującą sekwencję zadań:

  1. Środowisko odczytuje sekcję Global pliku .sln i przetwarza wszystkie sekcje oznaczone jako preSolution. W tym przykładowym pliku istnieje jedna taka instrukcja:

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

    Gdy środowisko odczytuje tag, mapuje GlobalSection('name') nazwę na pakiet VSPackage przy użyciu rejestru. Nazwa klucza powinna istnieć w rejestrze w obszarze [HKLM\\<Application ID Registry Root\>\SolutionPersistence\AggregateGUIDs]. Wartość domyślna kluczy to identyfikator GUID pakietu (REG_SZ) pakietu VSPackage, który zapisał wpisy.

  2. Środowisko ładuje pakiet VSPackage, wywołuje QueryInterface pakiet VSPackage dla interfejsu IVsPersistSolutionProps i wywołuje ReadSolutionProps metodę z danymi w sekcji, aby pakiet VSPackage mógł przechowywać dane. Środowisko powtarza ten proces dla każdej preSolution sekcji.

  3. Środowisko iteruje bloki trwałości projektu. W tym przypadku istnieje jeden projekt.

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

    Ta instrukcja zawiera unikatowy identyfikator GUID projektu i identyfikator GUID typu projektu. Te informacje są używane przez środowisko do znajdowania pliku projektu lub plików należących do rozwiązania oraz pakietu VSPackage wymaganego dla każdego projektu. Identyfikator GUID projektu jest przekazywany do IVsProjectFactory ładowania określonego pakietu VSPackage powiązanego z projektem, a następnie projekt jest ładowany przez pakiet VSPackage. W takim przypadku pakiet VSPackage załadowany dla tego projektu to Visual Basic.

    Każdy projekt może utrwały unikatowy identyfikator wystąpienia projektu, aby można było uzyskać do niego dostęp zgodnie z potrzebami innych projektów w rozwiązaniu. Najlepiej, jeśli rozwiązanie i projekty są objęte kontrolą kodu źródłowego, ścieżka do projektu powinna być względna względem ścieżki rozwiązania. Po pierwszym załadowaniu rozwiązania pliki projektu nie mogą znajdować się na komputerze użytkownika. Dzięki plikowi projektu, który jest przechowywany na serwerze względem pliku rozwiązania, łatwiej jest znaleźć i skopiować plik projektu na maszynę użytkownika. Następnie kopiuje i ładuje pozostałe pliki potrzebne do wykonania projektu.

  4. Na podstawie informacji zawartych w sekcji .sln projektu pliku środowisko ładuje każdy plik projektu. Sam projekt jest następnie odpowiedzialny za wypełnianie hierarchii projektu i ładowanie wszystkich zagnieżdżonych projektów.

  5. Po przetworzeniu .sln wszystkich sekcji pliku rozwiązanie jest wyświetlane w Eksplorator rozwiązań i jest gotowe do modyfikacji przez użytkownika.

Jeśli nie można załadować jakiegokolwiek projektu w rozwiązaniu, który implementuje pakiet VSPackage, OnProjectLoadFailure metoda jest wywoływana, a wszystkie projekty w rozwiązaniu ignorują zmiany, które mogły zostać wprowadzone podczas ładowania. W przypadku wszelkich błędów analizowania jak najwięcej informacji jest zachowywanych przy użyciu plików rozwiązania. Środowisko wyświetla okno dialogowe z ostrzeżeniem użytkownika, że rozwiązanie jest uszkodzone.

Po zapisaniu lub zamknięciu rozwiązania wywoływana QuerySaveSolutionProps jest metoda . Jest on przekazywany do hierarchii, aby sprawdzić, czy zmiany zostały wprowadzone w rozwiązaniu .sln , które należy wprowadzić w pliku. Wartość null przekazywana do QuerySaveSolutionProps elementu w systemie VSQUERYSAVESLNPROPSwskazuje, że informacje są utrwalane dla rozwiązania. Jeśli wartość nie ma wartości null, utrwalone informacje są przeznaczone dla określonego projektu określonego, określonego przez wskaźnik do interfejsu IVsHierarchy .

Jeśli istnieją informacje do zapisania, IVsSolutionPersistence interfejs jest wywoływany ze wskaźnikiem do SaveSolutionProps metody . WriteSolutionProps Następnie metoda jest wywoływana przez środowisko w celu pobrania par name-value z IPropertyBag interfejsu i zapisania informacji do .sln pliku.

SaveSolutionProps obiekty i WriteSolutionProps są wywoływane rekursywnie przez środowisko w celu pobrania informacji do zapisania z interfejsu IPropertyBag.sln do momentu wprowadzenia wszystkich zmian w pliku. W ten sposób można upewnić się, że informacje będą utrwalane w rozwiązaniu i dostępne przy następnym otwarciu rozwiązania.

Każdy załadowany pakiet VSPackage jest wyliczany, aby sprawdzić, czy ma coś do zapisania w .sln pliku. Zapytania o klucze rejestru są tworzone tylko w czasie ładowania. Środowisko wie o wszystkich załadowanych pakietach, ponieważ są w pamięci w momencie zapisania rozwiązania.

.sln Tylko plik zawiera wpisy w preSolution sekcjach i postSolution . W pliku .suo nie ma podobnych sekcji, ponieważ rozwiązanie wymaga poprawnego załadowania tych informacji. Plik .suo zawiera opcje specyficzne dla użytkownika, takie jak notatki prywatne, które nie mają być udostępniane ani umieszczane w ramach kontroli kodu źródłowego.