다음을 통해 공유


솔루션(.sln) 파일

솔루션은 Visual Studio에서 프로젝트를 구성하는 구조입니다. 솔루션은 두 파일의 프로젝트에 대한 상태 정보를 유지 관리합니다.

  • .sln 파일(텍스트 기반, 공유)

  • .suo 파일(이진, 사용자별 솔루션 옵션)

.suo 파일에 대한 자세한 정보는 솔루션 사용자 옵션(.suo) 파일을 참조하세요.

VSPackage가 .sln 파일에서 참조되었기 때문에 환경은 ReadSolutionProps를 호출하여 .sln 파일에서 읽습니다.

.sln 파일에는 환경이 지속형 데이터 및 참조하는 프로젝트 VSPackage에 대한 이름-값 매개 변수를 찾고 로드하는 데 사용하는 텍스트 기반 정보가 포함되어 있습니다. 사용자가 솔루션을 열면 환경이 preSolution, ProjectpostSolution 정보(.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 파일의 Global 섹션을 읽고 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를 호출하고, VSPackage가 데이터를 저장할 수 있게 섹션의 데이터로 ReadSolutionProps 메서드를 호출합니다. 환경은 각 preSolution 섹션에 대해 이 프로세스를 반복합니다.

  3. 환경은 프로젝트 지속성 블록을 반복합니다. 이 경우 하나의 프로젝트가 있습니다.

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

    이 문에는 고유한 프로젝트 GUID 및 프로젝트 형식 GUID가 포함됩니다. 이 정보는 환경에서 솔루션에 속한 프로젝트 파일 또는 파일 및 각 프로젝트에 필요한 VSPackage를 찾는 데 사용됩니다. 프로젝트와 관련된 특정 VSPackage를 로드하기 위해 프로젝트 GUID가 IVsProjectFactory에 전달된 다음, VSPackage가 프로젝트를 로드합니다. 이 경우 이 프로젝트에 대해 로드되는 VSPackage는 Visual Basic입니다.

    각 프로젝트는 솔루션의 다른 프로젝트에서 필요에 따라 액세스할 수 있도록 고유한 프로젝트 인스턴스 ID를 유지할 수 있습니다. 이상적으로, 솔루션과 프로젝트가 원본 코드 제어 하에 있는 경우 프로젝트의 경로는 솔루션 경로에 상대적이어야 합니다. 솔루션이 처음 로드되면 프로젝트 파일이 사용자의 컴퓨터에 있을 수 없습니다. 솔루션 파일을 기준으로 서버에 프로젝트 파일을 저장하면 프로젝트 파일을 찾아서 사용자의 컴퓨터에 복사하는 것이 더 간단합니다. 그런 다음, 프로젝트에 필요한 나머지 파일을 복사하고 로드합니다.

  4. .sln 파일의 프로젝트 섹션에 포함된 정보에 따라 환경은 각 프로젝트 파일을 로드합니다. 그런 다음, 프로젝트 자체는 프로젝트 계층 구조를 채우고 중첩된 프로젝트를 로드하는 역할을 담당합니다.

  5. After all sections of the .sln 파일의 모든 섹션이 처리되면 솔루션이 솔루션 탐색기에 표시되고 사용자가 수정할 준비가 됩니다.

솔루션에서 VSPackage를 구현하는 프로젝트가 로드되지 않으면 OnProjectLoadFailure 메서드가 호출되고 솔루션의 모든 프로젝트가 로드 중에 변경된 내용을 무시합니다. 구문 분석 오류의 경우 가능한 한 많은 정보가 솔루션 파일과 함께 유지됩니다. 환경에 솔루션이 손상되었음을 사용자에게 경고하는 대화 상자가 표시됩니다.

솔루션을 저장하거나 닫으면 QuerySaveSolutionProps 메서드가 호출됩니다. 이 메서드는 계층 구조로 전달되어 .sln 파일에 입력해야 하는 솔루션이 변경되었는지 확인합니다. VSQUERYSAVESLNPROPSQuerySaveSolutionProps에 전달된 null 값은 솔루션에 대한 정보가 유지되고 있음을 나타냅니다. 값이 null이 아닌 경우 유지되는 정보는 특정 프로젝트에 대한 것으로, IVsHierarchy 인터페이스에 대한 포인터에 따라 결정됩니다.

저장할 정보가 있으면 SaveSolutionProps 메서드에 대한 포인터를 사용하여 IVsSolutionPersistence 인터페이스가 호출됩니다. 그러면 환경에서 WriteSolutionProps 메서드를 호출하여 IPropertyBag 인터페이스에서 이름-값 쌍을 검색하고 정보를 .sln 파일에 씁니다.

SaveSolutionPropsWriteSolutionProps 개체는IPropertyBag 인터페이스에서 저장할 정보를 검색하기 위해 환경에서 재귀적으로 호출됩니다(모든 변경 내용이 .sln 파일에 입력될 때까지). 이러한 방식으로 솔루션과 함께 정보가 유지되고 다음에 솔루션을 열 때 사용할 수 있도록 보장할 수 있습니다.

로드된 모든 VSPackage는 .sln 파일에 저장할 항목이 있는지 확인하기 위해 열거됩니다. 레지스트리 키를 쿼리하는 것은 로드 시간에만 해당됩니다. 환경은 솔루션이 저장될 때 메모리에 있기 때문에 로드된 모든 패키지에 대해 알고 있습니다.

.sln 파일만 preSolutionpostSolution 섹션의 항목을 포함합니다. 솔루션에서 이 정보를 제대로 로드해야 하므로 .suo 파일에는 유사한 섹션이 없습니다. .suo 파일에는 공유하거나 원본 코드 제어 하에 배치할 수 없는 프라이빗 노트와 같은 사용자별 옵션이 포함되어 있습니다.