다음을 통해 공유


솔루션(.sln) 파일

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

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

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

.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 17
VisualStudioVersion = 17.2.32505.173
MinimumVisualStudioVersion = 10.0.40219.1

정의

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를 로드하고, 인터페이스에 대한 QueryInterface VSPackage를 호출 IVsPersistSolutionProps 하고, VSPackage가 데이터를 저장할 수 있도록 섹션의 데이터로 메서드를 호출 ReadSolutionProps 합니다. 환경은 각 preSolution 섹션에 대해 이 프로세스를 반복합니다.

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

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

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

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

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

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

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

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

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

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

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

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