프로젝트 하위 형식 디자인
프로젝트 하위 형식을 사용하면 VSPackages에서 MSBuild(Microsoft Build Engine)에 따라 프로젝트를 확장할 수 있습니다. 집계를 사용하면 Visual Studio에서 구현된 핵심 관리 프로젝트 시스템의 대부분을 재사용하면서도 특정 시나리오의 동작을 사용자 지정할 수 있습니다.
다음 토픽에서는 프로젝트 하위 형식의 기본 디자인 및 구현에 대해 자세히 설명합니다.
프로젝트 하위 형식 디자인
다중 수준 집계
인터페이스 지원
프로젝트 하위 형식 디자인
프로젝트 하위 형식의 초기화는 주 IVsHierarchy 및 IVsProject 개체를 집계하여 수행됩니다. 이 집계를 사용하면 프로젝트 하위 형식이 기본 프로젝트의 대부분의 기능을 재정의하거나 향상시킬 수 있습니다. 프로젝트 하위 형식은 IVsHierarchy를 사용하여 속성, IOleCommandTarget 및 IVsUIHierarchy를 사용하는 명령, IVsProject3를 사용하는 프로젝트 항목 관리를 처리할 수 있는 첫 번째 기회를 얻습니다. 프로젝트 하위 형식은 다음을 확장할 수도 있습니다.
프로젝트 구성 개체
구성 종속 개체
구성 독립적 찾아보기 개체
프로젝트 자동화 개체
프로젝트 자동화 속성 컬렉션
프로젝트 하위 형식별 확장성에 대한 자세한 내용은 프로젝트 하위 형식으로 확장된 속성 및 메서드를 참조하세요.
정책 파일
Visual Studio 환경은 정책 파일 구현에서 프로젝트 하위 형식을 사용하여 기본 프로젝트 시스템을 확장하는 예제를 제공합니다. 정책 파일은 솔루션 탐색기, 프로젝트 추가 대화 상자, 새 항목 추가 대화 상자, 속성 대화 상자를 포함하는 기능을 관리하여 Visual Studio 환경을 형성할 수 있습니다. 정책 하위 형식은 IVsFilterAddProjectItemDlg, IOleCommandTarget
, IVsUIHierarchy 구현을 통해 이러한 기능을 재정의하고 향상시킵니다.
집계 메커니즘
환경의 프로젝트 하위 형식 집계 메커니즘은 여러 수준의 집계를 지원하므로 고급 하위 형식을 추가적인 버전이 지정된 프로젝트로 구현할 수 있습니다. 또한 프로젝트 하위 형식의 지원 개체(예: IVsProjectFlavorCfg)는 여러 수준의 계층화를 허용하도록 설계되었습니다. COM 및 COM 집계 규칙의 제약 조건에 따라 내부 하위 형식 또는 기본 프로젝트가 메서드 호출 위임 및 참조 횟수 관리에 제대로 참여할 수 있도록 프로젝트 하위 형식 및 기본 프로젝트를 협조적으로 프로그래밍해야 합니다. 즉, 집계하려는 프로젝트는 집계를 지원하도록 프로그래밍되어야 합니다.
다음 그림에서는 다단계 프로젝트 하위 형식 집계의 도식적인 표현을 보여 줍니다.
다단계 프로젝트 하위 형식 집계는 세 가지 수준, 즉 기본 프로젝트로 구성되며 이는 프로젝트 하위 형식으로 집계된 다음 고급 프로젝트 하위 형식에 의해 추가로 집계됩니다. 이 그림에서는 Visual Studio 프로젝트 하위 형식 아키텍처의 일부로 제공되는 일부 지원 인터페이스에 중점을 둡니다.
배포 메커니즘
프로젝트 하위 형식에 의해 향상된 기본 프로젝트 시스템 기능 중에는 배포 메커니즘이 있습니다. 프로젝트 하위 형식은 IVsProjectCfgProvider에서 QueryInterface를 호출하여 검색되는 구성 인터페이스(예: IVsDeployableProjectCfg 및 IVsBuildableProjectCfg)를 구현하여 배포 메커니즘에 영향을 줍니다. 프로젝트 하위 형식과 고급 프로젝트 하위 형식이 서로 다른 구성 구현을 추가하는 시나리오에서 기본 프로젝트는 고급 프로젝트 하위 형식의 IUnknown
에서 QueryInterface
를 호출합니다. 내부 프로젝트 하위 형식에 기본 프로젝트가 요청하는 구성 구현이 포함되어 있으면 고급 프로젝트 하위 형식이 내부 프로젝트 하위 형식에서 제공하는 구현에 위임됩니다. 한 집계 수준에서 다른 집계 수준으로 상태를 유지하는 메커니즘으로, 프로젝트 하위 형식의 모든 수준은 빌드되지 않은 관련 XML 데이터를 프로젝트 파일에 유지하도록 IPersistXMLFragment를 구현합니다. 자세한 내용은 MSBuild 프로젝트 파일의 데이터 유지를 참조하세요. IInternalExtenderProvider는 프로젝트 하위 형식에서 자동화 Extenders를 검색하는 메커니즘으로 구현됩니다.
다음 그림에서는 특히 프로젝트 하위 형식에서 기본 프로젝트 시스템을 확장하는 데 사용되는 자동화 Extenders 구현, 프로젝트 구성 찾아보기 개체에 중점을 둡니다.
프로젝트 하위 형식은 자동화 개체 모델을 확장하여 기본 프로젝트 시스템을 추가로 확장할 수 있습니다. DTE 자동화 개체의 일부로 정의되며 Project 개체, ProjectItem
개체, Configuration
개체를 확장하는 데 사용됩니다. 자세한 내용은 기본 프로젝트의 개체 모델 확장을 참조하세요.
다중 수준 집계
하위 수준 프로젝트 하위 형식을 래핑하는 프로젝트 하위 형식 구현은 내부 프로젝트 하위 형식이 제대로 작동할 수 있도록 협조적으로 프로그래밍되어야 합니다. 프로그래밍 책임 목록에는 다음이 포함됩니다.
내부 하위 형식을 래핑하는 프로젝트 하위 형식의 IPersistXMLFragment 구현은 Load 및 Save 메서드 모두의 내부 프로젝트 하위 형식의 IPersistXMLFragment 구현에 위임해야 합니다.
래퍼 프로젝트 하위 형식의 IInternalExtenderProvider 구현은 내부 프로젝트 하위 형식의 구현에 위임해야 합니다. 특히 GetExtenderNames의 구현은 내부 프로젝트 하위 형식에서 이름 문자열을 가져온 다음, Extender로 추가하려는 문자열을 연결해야 합니다.
래퍼 프로젝트 하위 형식의 IVsProjectCfgProvider 구현은 기본 프로젝트의 프로젝트 구성 개체만 래퍼 프로젝트 하위 형식 구성 개체가 존재한다는 것을 직접 알 수 있기 때문에 내부 프로젝트 하위 형식의 IVsProjectFlavorCfg 개체를 인스턴스화하고 프라이빗 대리자로 유지해야 합니다. 외부 프로젝트 하위 형식은 처음에 직접 처리하려는 구성 인터페이스를 선택한 다음 나머지를 내부 프로젝트 하위 형식의 get_CfgType 구현에 위임할 수 있습니다.
인터페이스 지원
기본 프로젝트는 프로젝트 하위 형식에 의해 추가된 지원 인터페이스를 호출을 위임하여 구현의 다양한 측면을 확장합니다. 여기에는 프로젝트 구성 개체 및 다양한 속성 브라우저 개체 확장이 포함됩니다. 이러한 인터페이스는 가장 바깥쪽 프로젝트 하위 형식 집계의 punkOuter
(IUnknown
에 대한 포인터)에서 QueryInterface
를 호출하여 검색됩니다.
인터페이스 | 프로젝트 하위 형식 |
---|---|
IVsProjectFlavorCfg | 프로젝트 하위 형식이 다음을 수행할 수 있도록 허용합니다. - IVsDeployableProjectCfg의 구현을 제공합니다. - 프로젝트 하위 형식이 IVsDebuggableProjectCfg의 자체 구현을 제공할 수 있도록 허용하여 디버거의 시작을 제어합니다. - QueryDebugLaunch의 구현에서 DBGLAUNCH_DesignTimeExprEval 사례를 적절하게 처리하여 디자인 타임 식 평가를 사용하지 않도록 설정합니다. |
IInternalExtenderProvider | 프로젝트 하위 형식이 다음을 수행할 수 있도록 허용합니다. - 프로젝트의 VSHPROPID_BrowseObject를 확장하여 프로젝트의 구성 독립 속성을 추가하거나 제거합니다. - 프로젝트의 프로젝트 자동화 개체(VSHPROPID_ExtObject)를 확장합니다. 위의 속성 값은 __VSHPROPID2 열거형에서 가져옵니다. |
IVsCfgBrowseObject | 프로젝트 하위 형식은 프로젝트 구성 찾아보기 개체가 지정된 IVsCfg 개체에 다시 매핑할 수 있도록 허용합니다. |
IVsBrowseObject | 프로젝트 하위 형식은 프로젝트 구성 찾아보기 개체가 지정된 IVsHierarchy 또는 VSITEMID 개체에 다시 매핑할 수 있도록 허용합니다. |
IPersistXMLFragment | 프로젝트 하위 형식이 임의의 XML 구조 데이터를 프로젝트 파일(.vbproj 또는 .csproj)에 유지할 수 있도록 허용합니다. 이 데이터는 MSBuild에 표시되지 않습니다. |
IVsBuildPropertyStorage | 프로젝트 하위 형식이 다음을 수행할 수 있도록 허용합니다. - 유지할 새 MSBuild 속성을 추가합니다. - MSBuild에서 불필요한 속성을 제거합니다. - MSBuild 속성의 현재 값을 쿼리합니다. - MSBuild 속성의 현재 값을 변경합니다. |