방법: 프로젝트 시스템 업그레이드
정보를 유지 하 되 프로젝트 파일 간에 서로 다른 Visual Studio 버전의 제품을 변경 하 여 있으면 프로젝트 파일을 새 버전으로 업그레이드를 지원 해야 합니다. 에 참여할 수 있도록 업그레이드를 지원할 수는 Visual Studio 변환 마법사, 구현에서 IVsProjectUpgradeViaFactory 인터페이스. 이 인터페이스에 복사본을 업그레이드 하는 것에 대 한 유일한 메커니즘을 사용할 수 있습니다. 솔루션의 일부를 열 때 프로젝트의 업그레이드 문제가 발생 합니다. IVsProjectUpgradeViaFactory 인터페이스 프로젝트 팩터리에서 구현 또는 최소한 프로젝트 공장에서 얻을 수 있어야 합니다.
이전 메커니즘을 사용 하 여 IVsProjectUpgrade 인터페이스는 여전히 지원 되지만 개념적으로 열린 프로젝트의 일부로 프로젝트 시스템을 업그레이드 합니다. IVsProjectUpgrade 인터페이스 때문 이라고는 Visual Studio 경우에도 환경은 IVsProjectUpgradeViaFactory 인터페이스를 호출 하거나 구현 합니다. 이 방법을 사용할 수 있습니다 IVsProjectUpgradeViaFactory 복사본을 구현 및 업그레이드의 일부분에만 프로젝트 (새 위치)에 가능한 장소에서 수행 해야 하는 작업의 나머지 부분에서 위임할 수 있는 IVsProjectUpgrade 인터페이스.
샘플 구현에 대 한 IVsProjectUpgrade를 참조 하십시오 Visual Studio 확장성 샘플.
다음과 같은 경우 프로젝트 업그레이드를 발생 합니다.
파일 프로젝트를 지원할 수 있는 것이 새로운 형식에는이 나타내는 오류가 반환 해야 합니다. 이 가정 구 버전의 제품을-예를 들어, Visual Studio.Net-의 버전을 확인 하는 코드를 포함 합니다.
경우는 PUVFF_SXSBACKUP 에 플래그를 지정은 UpgradeProject 메서드를 업그레이드 무슨에 적절 한 업그레이드를 여는 프로젝트는 이전에 구현 될 것입니다.
경우는 PUVFF_COPYBACKUP 에 플래그를 지정은 UpgradeProject 방법, 업그레이드 복사본 업그레이드로 구현 됩니다.
경우는 UPF_SILENTMIGRATE 에 플래그를 지정은 UpgradeProject 프로젝트를 연 후 프로젝트 파일은 사용 중 업그레이드로 업그레이드 하는 사용자 환경에서 표시 되 고 호출 합니다. 예를 들어, 환경 사용자는 이전 버전의 솔루션을 열면 업그레이드 하 라는 메시지입니다.
경우는 UPF_SILENTMIGRATE 에 플래그가 지정 되지 않은 UpgradeProject 호출 하 고 사용자가 프로젝트 파일을 업그레이드 하 라는 메시지를 표시 해야 합니다.
다음 예제에서는 업그레이드 프롬프트 메시지입니다.
"'%1' 프로젝트는 이전 버전의 Visual Studio 만들어졌습니다. 이 버전의 Visual Studio 연 Visual Studio 이전 버전으로 열 수 없습니다. 계속 해 서이 프로젝트를 열고 하 시겠습니까 "?
Ivsprojectupgradeviafactory를 구현.
구현 하는 방법을 IVsProjectUpgradeViaFactory 인터페이스, 구체적으로 UpgradeProject 프로젝트 팩터리 구현에서 메서드 또는 구현 프로젝트 팩터리 구현에서 호출할 수 있도록.
열 솔루션의 일부로 전체 업그레이드를 수행 하려면 플래그를 제공 PUVFF_SXSBACKUP 로 VSPUVF_FLAGS 매개 변수를 UpgradeProject 구현.
열 솔루션의 일부로 전체 업그레이드를 수행 하려면 플래그를 제공 PUVFF_COPYBACKUP 로 VSPUVF_FLAGS 매개 변수를 UpgradeProject 구현.
두 단계 2와 3은 실제 파일 업그레이드 단계를 사용 하 여 IVsQueryEditQuerySave2에서 설명 하는 대로 구현할 수는 "구현 IVsProjectUpgade" 섹션 아래에 나 실제 파일 업그레이드를 위임할 수 있습니다 IVsProjectUpgrade.
메서드를 사용 하 여 IVsUpgradeLogger 업그레이드 후에 메시지 Visual Studio 마이그레이션 마법사를 사용 하 여 사용자에 대 한 관련입니다.
IVsFileUpgrade인터페이스를 사용 하 여 프로젝트 업그레이드의 일부로 발생 해야 하는 파일 업그레이드의 어떤 종류를 구현 합니다. 이 인터페이스에서 호출 되지 않습니다 IVsProjectUpgradeViaFactory, 프로젝트 시스템의 주요 프로젝트 시스템에 포함 된 파일을 업그레이드 하기 위한 메커니즘을 직접 인식 수 있습니다 제공 됩니다. 예를 들어, 파일 및 등록 정보는 프로젝트 시스템의 나머지 부분 처리 같은 개발 팀에서 처리 되지 않는 컴파일러에 관련 된 경우 이러한 상황이 발생할 수 있습니다.
IVsProjectUpgrade 구현
프로젝트 시스템을 구현 하는 경우 IVsProjectUpgrade 만 참여할 수 있습니다 않는 있는 Visual Studio 변환 마법사. 그러나 구현 하는 경우에는 IVsProjectUpgradeViaFactory 인터페이스에도 위임할 수 있습니다 파일 업그레이드 IVsProjectUpgrade 구현 합니다.
Ivsprojectupgrade를 구현.
사용자가 프로젝트를 열 때의 UpgradeProject 메서드는 환경에 의해 호출에서 프로젝트를 연 후 하기 전에 다른 사용자가 프로젝트에 대해 조치를 취할 수 있습니다. 이미 솔루션을 업그레이드 하 라는 메시지가 되지 해야 했습니다 경우 다음에 UPF_SILENTMIGRATE 플래그에 전달 되는 grfUpgradeFlags 매개 변수. 사용자가 프로젝트를 직접 이러한 경우 as를 사용 하 여는 기존 프로젝트 추가 명령, 다음은 UPF_SILENTMIGRATE 플래그를 전달 된 및 업그레이드를 요청 하 여 프로젝트에 필요한.
에 응답 하는 UpgradeProject 호출 해야 프로젝트 평가 프로젝트 파일 업그레이드 여부. 프로젝트 프로젝트 형식을 새 버전으로 업그레이드 할 경우 간단 하 게 돌아올 수 있는 S_OK 플래그입니다.
프로젝트 형식에 새 버전으로 업그레이드 하는 프로젝트에 필요한 경우를 호출 하 여 프로젝트 파일을 수정할 수 있는지 여부를 확인 해야는 QueryEditFiles 값을 전달 하 고 메서드 QEF_ReportOnly 에 rgfQueryEdit 매개 변수. 다음 프로젝트는 다음을 수행 해야 합니다.
경우는 VSQueryEditResult 에서 반환 된 값은 pfEditCanceled 매개 변수입니다 QER_EditOK, 프로젝트 파일에 쓸 수 있기 때문에 업그레이드를 진행할 수 있습니다 하 고.
경우는 VSQueryEditResult 에서 반환 된 값의 pfEditCanceled 매개 변수입니다 QER_EditNotOK 및 VSQueryEditResult 값이는 QER_ReadOnlyNotUnderScc 비트가 설정, 다음 UpgradeProject 사용자 권한을 발급할 스스로 문제를 해결 해야 하기 때문에 오류를 반환 해야 합니다. 프로젝트 다음 다음을 수행 합니다.
호출 하 여 사용자에 게 오류 보고 ReportErrorInfo. 반환 하는 VS_E_PROJECTMIGRATIONFAILED 오류 코드를 IVsProjectUpgrade.
경우는 VSQueryEditResult 값이 QER_EditNotOK 및 VSQueryEditResultFlags 값이는 QER_ReadOnlyUnderScc 비트가 설정, 프로젝트 파일 호출 하 여 체크 아웃할지 다음 QueryEditFiles (QEF_ForceEdit_NoPrompting, QEF_DisallowInMemoryEdits,...).
경우는 QueryEditFiles 프로젝트 파일에서 호출 됩니다 파일을 체크 아웃 하 고 최신 버전을 검색 해야 하 고 프로젝트를 언로드한 다음 다시 로드 합니다. UpgradeProject 메서드가 호출 다시 프로젝트의 다른 인스턴스를 만들면 됩니다. 이 두 번째 호출에서 프로젝트 파일에 쓸 수 있는 디스크입니다. 프로젝트 이전 형식으로 프로젝트 파일의 복사본을 저장 하는 것이 좋습니다 있는.이전 확장명의 필요한 업그레이드 변경 하 고 프로젝트 파일을 새 형식으로 저장 합니다. 업그레이드 프로세스의 일부에 오류가 발생 하는 경우 다시 메서드가 오류를 반환 하 여 지정 해야 VS_E_PROJECTMIGRATIONFAILED. 그러면 프로젝트를 솔루션 탐색기에서 로드할 수 없습니다.
환경에 있는 경우에 발생 하는 전체 프로세스를 이해 하는 것이 중요 호출에는 QueryEditFiles 메서드 (ReportOnly 값이 지정 됨)를 반환의 QER_EditNotOK 및 QER_ReadOnlyUnderScc 플래그.
사용자가 프로젝트 파일을 열려고 시도 합니다.
환경 호출을 CanCreateProject 구현 합니다.
경우 CanCreateProject 반환 true, 다음 환경 호출을 CanCreateProject 구현 합니다.
환경 호출을 Load Project1 구현 파일을 열고 예를 들어, 프로젝트 개체를 초기화 합니다.
환경 호출을 IVsProjectUpgrade::UpgradeProject 구현 프로젝트 파일 업그레이드 해야 하는지 여부를 결정 합니다.
호출 하 여 QueryEditFiles 에서 값을 전달 하 고 QEF_ReportOnly 에 있는 rgfQueryEdit 매개 변수.
환경 반환 QER_EditNotOK 에 대 한 VSQueryEditResult 및 QER_ReadOnlyUnderScc 비트가 설정 VSQueryEditResultFlags.
Your IVsProjectUpgrade implementation calls IVsQueryEditQuerySave::QueryEditFiles (QEF_ForceEdit_NoPrompting, QEF_DisallowInMemoryEdits).
이 호출 체크 아웃 하려면 프로젝트 파일의 새 복사본이 될 수 있고 프로젝트 파일을 다시 로드 해야 하는 및 최신 버전을 검색 합니다. 이 두 가지 작업 중 하나가 발생 합니다.
고유한 프로젝트 다시 로드를 처리 하는 경우 다음 환경 호출을 ReloadItem (VSITEMID_ROOT) 구현 합니다. 이 호출을 받을 때 프로젝트 (Project1)의 첫 번째 인스턴스를 다시 로드 하 고 프로젝트 파일 업그레이드를 계속 합니다. 반환 하면 사용자 고유의 프로젝트 다시 로드를 처리 환경을 알고 true 에 대 한 GetProperty (VSHPROPID_HandlesOwnReload).
고유한 프로젝트 다시 로드를 처리 하지 않으면 다시 false 에 대 한 GetProperty (VSHPROPID_HandlesOwnReload). 이 경우 전 QueryEditFiles(QEF_ForceEdit_NoPrompting, QEF_DisallowInMemoryEdits에서) 반환 하는 환경을 만들기 다른 새, 프로젝트, 예를 들어, 추가 인스턴스는 다음과 같이:
환경 호출 Close project1을 처음 project 개체에이 개체가 비활성 상태에 따라서 배치 합니다.
환경 호출을 IVsProjectFactory::CreateProject 구현을 추가 하 여 프로젝트의 두 번째 인스턴스를 만들 수 있습니다.
환경 호출을 IPersistFileFormat::Load 파일을 열고 추가 두 번째 프로젝트 개체를 초기화 하려면 구현 합니다.
환경 호출 IVsProjectUpgrade::UpgradeProject project 개체를 업그레이드할 수 있는지 여부를 확인 하려면 두 번째 시간입니다. 그러나이 호출이 새의 두 번째 인스턴스를 프로젝트에 추가 생성 됩니다. 이 솔루션에 열려 있는 프로젝트입니다.
참고
Project1 프로젝트, 비활성 상태에 배치 됩니다 다음 반환 해야 하는 인스턴스를 S_OK 첫 번째 호출에서 사용자 UpgradeProject 구현 합니다.참조 하십시오 Basic Project 의 구현에 대 한 IVsProjectUpgrade::UpgradeProject.
호출 하 여 QueryEditFiles 에서 값을 전달 하 고 QEF_ReportOnly 에 있는 rgfQueryEdit 매개 변수.
환경 반환 QER_EditOK 프로젝트 파일에 쓸 수 있기 때문에 업그레이드를 진행할 수 있습니다.
업그레이드에 실패 하면 반환 VS_E_PROJECTMIGRATIONFAILED 에서 IVsProjectUpgrade::UpgradeProject. 업그레이드가 필요 없거나 않는 업그레이드에 처리 하도록 선택 하면 해당 IVsProjectUpgrade::UpgradeProject 로 아무를 호출 합니다. 반환 하는 경우 VS_E_PROJECTMIGRATIONFAILED에 있는 자리 표시자 노드 프로젝트를 솔루션에 추가 됩니다.