다음을 통해 공유


솔루션의 프로젝트 로드 관리

Visual Studio 솔루션에는 많은 수의 프로젝트가 포함될 수 있습니다. 기본 Visual Studio 동작은 솔루션이 열릴 때 솔루션의 모든 프로젝트를 로드하고 모든 프로젝트 로드가 완료될 때까지 사용자가 프로젝트에 액세스할 수 없도록 하는 것입니다. 프로젝트 로드 프로세스가 2분 넘게 지속되면 로드된 프로젝트 수와 총 프로젝트 수를 보여 주는 진행률 표시줄이 표시됩니다. 사용자는 여러 프로젝트를 사용하여 솔루션에서 작업하는 동안 프로젝트를 언로드할 수 있지만, 이 절차에는 몇 가지 단점이 있습니다. 언로드된 프로젝트는 솔루션 다시 빌드 명령의 일부로 빌드되지 않으며 닫힌 프로젝트의 형식 및 멤버에 대한 IntelliSense 설명은 표시되지 않습니다.

개발자는 솔루션 로드 관리자를 만들어 솔루션 로드 시간을 줄이고 프로젝트 로드 동작을 관리할 수 있습니다. 솔루션 로드 관리자는 백그라운드 빌드를 시작하기 전에 프로젝트가 로드되도록 하고, 다른 백그라운드 작업이 완료될 때까지 백그라운드 로드를 지연하고, 다른 프로젝트 로드 관리 작업을 수행할 수 있습니다.

솔루션 로드 관리자 만들기

개발자는 IVsSolutionLoadManager를 구현하고 Visual Studio에 솔루션 로드 관리자가 활성 상태임을 알려 솔루션 로드 관리자를 만들 수 있습니다.

솔루션 로드 관리자 활성화

Visual Studio에서는 일정 시점에 하나의 솔루션 로드 관리자만 허용되므로 솔루션 로드 관리자를 활성화하려는 시점을 Visual Studio에 알려야 합니다. 나중에 두 번째 솔루션 로드 관리자가 활성화되면 해당 솔루션 로드 관리자의 연결이 끊어집니다.

SVsSolution 서비스를 가져오고 __VSPROPID4.VSPROPID_ActiveSolutionLoadManager 속성을 설정해야 합니다.

IVsSolution pSolution = GetService(typeof(SVsSolution)) as IVsSolution;
object objLoadMgr = this;   //the class that implements IVsSolutionManager
pSolution.SetProperty((int)__VSPROPID4.VSPROPID_ActiveSolutionLoadManager, objLoadMgr);

OnDisconnect 메서드는 Visual Studio를 종료할 때나, 다른 패키지가 __VSPROPID4.VSPROPID_ActiveSolutionLoadManager 속성으로 SetProperty를 호출하여 활성 솔루션 로드 관리자가 될 때 호출됩니다.

다양한 종류의 솔루션 로드 관리자에 대한 전략

관리하려는 솔루션 유형에 따라 다양한 방법으로 솔루션 로드 관리자를 구현할 수 있습니다.

솔루션 로드 관리자가 일반적으로 솔루션 로드를 관리하려는 경우 VSPackage의 일부로 구현할 수 있습니다. VSPackage에 SolutionOpening_guid 값으로 ProvideAutoLoadAttribute를 추가하여 패키지를 자동 로드하도록 설정해야 합니다. 그런 다음, 솔루션 로드 관리자를 Initialize 메서드에서 활성화할 수 있습니다.

참고 항목

패키지 자동 로드에 대한 자세한 정보는 VSPackage 로드를 참조하세요.

Visual Studio는 활성화할 마지막 솔루션 로드 관리자만 인식하므로 일반 솔루션 로드 관리자는 자신을 활성화하기 전에 항상 기존 로드 관리자가 있는지 여부를 검색해야 합니다. __VSPROPID4.VSPROPID_ActiveSolutionLoadManager에 대해 솔루션 서비스에서 GetProperty()를 호출할 경우 null을 반환합니다. 즉, 활성 상태인 로드 관리자가 없습니다. null을 반환하지 않는 경우 개체가 솔루션 로드 관리자와 동일한지 확인합니다.

솔루션 로드 관리자로 몇 가지 유형의 솔루션만 관리하려는 경우 VSPackage는 솔루션 로드 이벤트를 구독하고(AdviseSolutionEvents 호출을 통해) OnBeforeOpenSolution에 대한 이벤트 처리기를 사용하여 솔루션 로드 관리자를 활성화할 수 있습니다.

솔루션 로드 관리자가 특정 솔루션만 관리하려는 경우 솔루션 전 섹션에 대해 WriteSolutionProps를 호출하여 활성화 정보를 솔루션 파일의 일부로 유지할 수 있습니다.

특정 솔루션 로드 관리자는 다른 솔루션 로드 관리자와 충돌하지 않도록 OnAfterCloseSolution 이벤트 처리기에서 자신을 비활성화해야 합니다.

전역 프로젝트 로드 속성(예: 옵션 페이지에 설정된 속성)을 유지하기 위해서만 솔루션 로드 관리자가 필요한 경우 OnAfterOpenProject 이벤트 처리기에서 솔루션 로드 관리자를 활성화하고 솔루션 속성에서 설정을 유지한 다음, 솔루션 로드 관리자를 비활성화할 수 있습니다.

솔루션 로드 이벤트 처리

솔루션 로드 이벤트를 구독하려면 솔루션 로드 관리자를 활성화할 때 AdviseSolutionEvents를 호출합니다. IVsSolutionLoadEvents를 구현하는 경우 다른 프로젝트 로드 속성과 관련된 이벤트에 응답할 수 있습니다.

  • OnBeforeOpenSolution: 솔루션이 열리기 전에 이 이벤트가 발생합니다.

  • OnBeforeBackgroundSolutionLoadBegins: 솔루션이 완전히 로드된 후 백그라운드 프로젝트 로드가 다시 시작되기 전에 이 이벤트가 발생합니다.

  • OnAfterBackgroundSolutionLoadComplete: 솔루션 로드 관리자가 있는지 여부에 관계없이 솔루션이 처음 완전히 로드된 후에 이 이벤트가 발생합니다. 또한 솔루션이 완전히 로드될 때마다 백그라운드 로드 또는 수요 로드 후에 발생합니다. 동시에 SolutionExistsAndFullyLoaded_guid가 다시 활성화됩니다.

  • OnQueryBackgroundLoadProjectBatch: 이 이벤트는 하나 이상의 프로젝트를 로드하기 전에 발생합니다. 프로젝트 로드 전에 다른 백그라운드 프로세스가 완료되도록 하려면 pfShouldDelayLoadToNextIdletrue로 설정합니다.

  • OnBeforeLoadProjectBatch: 이 이벤트는 프로젝트 일괄 처리가 로드될 때 발생합니다. fIsBackgroundIdleBatch가 true이면 프로젝트가 백그라운드에서 로드됩니다. fIsBackgroundIdleBatch가 false이면 사용자가 솔루션 탐색기에서 대기 중인 프로젝트를 확장하는 경우와 같이 사용자 요청의 결과로 프로젝트가 동기적으로 로드됩니다. 그 밖에 비용이 많이 드는 작업을 수행하기 위해 이 이벤트를 처리하려면 OnAfterOpenProject에서 이 이벤트를 처리할 수 있습니다.

  • OnAfterLoadProjectBatch: 프로젝트 일괄 처리가 로드된 후 이 이벤트가 발생합니다.

솔루션 및 프로젝트 로드 검색 및 관리

프로젝트 및 솔루션의 부하 상태를 검색하려면 다음 값을 사용하여 GetProperty를 호출합니다.

다음 메서드 중 하나를 호출하여 프로젝트 및 솔루션을 로드할 수도 있습니다.

  • EnsureSolutionIsLoaded: 이 메서드를 호출하면 메서드 반환 전에 솔루션에 프로젝트가 강제로 로드됩니다.

  • EnsureProjectIsLoaded: 이 메서드를 호출하면 메서드 반환 전에 guidProject에 프로젝트가 강제로 로드됩니다.

  • EnsureProjectsAreLoaded: 이 메서드를 호출하면 메서드 반환 전에 guidProjectID에 프로젝트가 강제로 로드됩니다.