Como: atualizar sistemas do projeto
Se você alterar as informações mantidas no arquivo de projeto entre versões diferentes de Visual Studio de seu produto, em seguida, você precisa oferecer suporte a atualizar seu arquivo de projeto do antigo para a nova versão. Para suporte à atualização que permite que você participe do Visual Studio Assistente de conversão de, implementar a IVsProjectUpgradeViaFactory interface. Essa interface contém o único mecanismo disponível para atualizar a cópia. A atualização do projeto acontece como uma parte da solução é aberta. O IVsProjectUpgradeViaFactory interface é implementada pela fábrica de projeto ou pelo menos deve ser obtido na fábrica de projeto.
O mecanismo antigo que usa a IVsProjectUpgrade interface ainda é suportado, mas conceitualmente atualiza o sistema de projeto como parte do projeto aberto. O IVsProjectUpgrade interface, portanto, é chamado pelo Visual Studio mesmo se do ambiente de IVsProjectUpgradeViaFactory interface é chamado ou implementado. Essa abordagem permite que você use IVsProjectUpgradeViaFactory para implementar a cópia e apenas com partes da atualização de projeto e delegue o resto do trabalho a ser feito no local (possivelmente no novo local) o IVsProjectUpgrade interface.
Para uma implementação de exemplo do IVsProjectUpgrade, consulte Exemplos de extensibilidade de Visual Studio.
Os cenários a seguir surgirem com as atualizações do projeto:
Se o arquivo for de um formato mais recente que o projeto pode suportar, ela deve retornar um erro indicando isso. Isso pressupõe que a versão mais antiga do seu produto — por exemplo, Visual Studio.NET 2003 – inclui código para verificar a versão.
Se a PUVFF_SXSBACKUP sinalizador é especificado na UpgradeProject método, a atualização vai ser implementado como uma atualização in-loco antes para a abertura do projeto.
Se a PUVFF_COPYBACKUP sinalizador é especificado na UpgradeProject método, a atualização é implementado como uma atualização de cópia.
Se a UPF_SILENTMIGRATE sinalizador é especificado na UpgradeProject chamar, então o usuário foi solicitado pelo ambiente de atualizar o arquivo de projeto como uma atualização in-loco, depois que o projeto é aberto. Por exemplo, o ambiente de solicita ao usuário para atualizar quando o usuário abre uma versão mais antiga da solução.
Se a UPF_SILENTMIGRATE sinalizador não for especificado na UpgradeProject chamar, e em seguida, você deverá solicitar ao usuário para atualizar o arquivo de projeto.
Este é uma mensagem de aviso de atualização exemplo:
"O projeto '% 1' foi criado com uma versão antiga do Visual Studio. Se você abri-lo com esta versão do Visual Studio, você não poderá abri-lo com versões mais antigas do Visual Studio. Você deseja continuar e abrir este projeto?"
Para implementar a IVsProjectUpgradeViaFactory
Implementar o método de IVsProjectUpgradeViaFactory interface, especificamente o UpgradeProject método na implementação de fábrica do projeto, ou fazer com que as implementações podem ser chamados a partir de sua implementação de fábrica do projeto.
Se você deseja fazer uma atualização in-loco como parte da solução abrindo, fornecer o sinalizador PUVFF_SXSBACKUP como o VSPUVF_FLAGS parâmetro em sua UpgradeProject implementação.
Se você deseja fazer uma atualização in-loco como parte da solução abrindo, fornecer o sinalizador PUVFF_COPYBACKUP como o VSPUVF_FLAGS parâmetro em sua UpgradeProject implementação.
Para ambas as etapas 2 e 3, o arquivo real atualizar etapas, usando IVsQueryEditQuerySave2, podem ser implementados conforme descrito no "Implementing IVsProjectUpgade" seção abaixo, ou você pode delegar a atualização do arquivo real para o IVsProjectUpgrade.
Use os métodos de IVsUpgradeLogger ao lançar a atualização relacionada mensagens para o usuário usando o Assistente de migração de Visual Studio.
IVsFileUpgradeinterface é usada para implementar qualquer tipo de atualização do arquivo que precise ocorrer como parte da atualização do projeto. Esta interface não é chamada de IVsProjectUpgradeViaFactory, mas é fornecido como um mecanismo para atualizar os arquivos que fazem parte do sistema do projeto, mas o sistema de projeto principal não pode ser diretamente compatível com. Por exemplo, essa situação pode ocorrer se o compilador relacionadas a arquivos e propriedades não são tratadas pela equipe de desenvolvimento mesmo que cuida do resto do sistema do projeto.
Implementação de IVsProjectUpgrade
Se seu sistema de projeto implementa IVsProjectUpgrade apenas, não pode participar na Visual Studio Assistente de conversão de. No entanto, mesmo que você implemente o IVsProjectUpgradeViaFactory interface, você ainda pode delegar a atualização do arquivo para IVsProjectUpgrade implementação.
Para implementar a IVsProjectUpgrade
Quando um usuário tenta abrir um projeto, o UpgradeProject método é chamado pelo ambiente depois que o projeto é aberto e a ação antes de qualquer outro usuário possa ser realizada no projeto. Se o usuário já tinha sido solicitado para atualizar a solução, em seguida, a UPF_SILENTMIGRATE sinalizador é passado a grfUpgradeFlags parâmetro. Se o usuário abrir um projeto diretamente, tal como usando o Add Existing Project comando, em seguida, a UPF_SILENTMIGRATE não é passado um sinalizador e o projeto precisa solicitar ao usuário para atualizar.
Em resposta para o UpgradeProject chamada, o projeto deve avaliar se o arquivo de projeto é atualizado. Se o projeto não precisa atualizar o projeto para uma nova versão, então ele pode simplesmente retornar o S_OK sinalizador.
Se o projeto precisa atualizar o projeto para uma nova versão, então ele deve determinar se o arquivo de projeto pode ser modificado, chamando o QueryEditFiles método e passando um valor de QEF_ReportOnly para o rgfQueryEdit parâmetro. Em seguida, o projeto precisa fazer o seguinte:
Se a VSQueryEditResult valor retornado na pfEditCanceled parâmetro é QER_EditOK, e em seguida, a atualização possa continuar porque o arquivo de projeto pode ser gravado.
Se a VSQueryEditResult valor retornado na pfEditCanceled parâmetro é QER_EditNotOK e o VSQueryEditResult valor tem o QER_ReadOnlyNotUnderScc bit definido, em seguida, UpgradeProject deve retornar falha, porque os usuários devem resolver as permissões emitem propriamente ditos. O projeto deve, em seguida, faça o seguinte:
Relatar o erro para o usuário chamando ReportErrorInfo. e retornar o VS_E_PROJECTMIGRATIONFAILED código de erro para IVsProjectUpgrade.
Se a VSQueryEditResult o valor é QER_EditNotOK e o VSQueryEditResultFlags valor tem o QER_ReadOnlyUnderScc bit definido, e em seguida, o arquivo de projeto deve fazer check-out, chamando QueryEditFiles (QEF_ForceEdit_NoPrompting, QEF_DisallowInMemoryEdits,...).
Se a QueryEditFiles chamada no arquivo de projeto faz com que o arquivo de check-out e a versão mais recente para serem recuperadas, em seguida, o projeto é descarregado e recarregado. O UpgradeProject método for chamado novamente após a criação de outra instância do projeto. Nesta segunda chamada, o arquivo de projeto pode ser gravado em disco; é recomendável que o projeto salvar uma cópia do arquivo de projeto no formato anterior com um.Extensão do antigo, faça suas alterações de atualização necessárias e salve o arquivo de projeto no novo formato. Novamente, se qualquer parte do processo de atualização falhar, o método deve indicar falha retornando VS_E_PROJECTMIGRATIONFAILED. Isso faz com que o projeto seja descarregado no Solution Explorer.
É importante compreender o processo completo que ocorre no ambiente para o caso em que a chamada para o QueryEditFiles método (especificando um valor de ReportOnly) retorna o QER_EditNotOK e o QER_ReadOnlyUnderScc sinalizadores.
O usuário tentar abrir o arquivo de projeto.
As chamadas de ambiente sua CanCreateProject implementação.
Se CanCreateProject retorna true, e depois chama o ambiente sua CanCreateProject implementação.
As chamadas de ambiente sua Load implementação para abri-lo e inicializar o objeto de projeto, por exemplo, Projeto1.
As chamadas de ambiente sua IVsProjectUpgrade::UpgradeProject implementação para determinar se o arquivo de projeto precisa ser atualizado.
Você chamar QueryEditFiles e passe um valor de QEF_ReportOnly para o rgfQueryEdit parâmetro.
O ambiente retorna QER_EditNotOK para VSQueryEditResult e o QER_ReadOnlyUnderScc bit é definido em VSQueryEditResultFlags.
Your IVsProjectUpgrade implementation calls IVsQueryEditQuerySave::QueryEditFiles (QEF_ForceEdit_NoPrompting, QEF_DisallowInMemoryEdits).
Essa chamada pode causar uma nova cópia do seu arquivo de projeto check-out e a versão mais recente é recuperado, bem como a necessidade de recarregar o arquivo de projeto. Neste ponto, uma das duas coisas acontecem:
Se você lida com sua própria recarga do projeto, em seguida, o ambiente chama o ReloadItem implementação (VSITEMID_ROOT). Quando você recebe essa chamada, recarregue a primeira instância do seu projeto (Projeto1) e continuar a atualizar seu arquivo de projeto. O ambiente sabe lidar com seu próprio projeto de recarga se você retornar true para GetProperty (VSHPROPID_HandlesOwnReload).
Se você não tratar recarregar seu próprio projeto, você pode retornar false para GetProperty (VSHPROPID_HandlesOwnReload). Nesse caso, antes de QueryEditFiles(QEF_ForceEdit_NoPrompting, QEF_DisallowInMemoryEdits,) retorna o ambiente cria outra nova, a instância do seu projeto, por exemplo, Projeto2, da seguinte maneira:
As chamadas de ambiente Close em seu primeiro objeto de projeto, Projeto1, colocando, assim, esse objeto no estado inativo.
As chamadas de ambiente sua IVsProjectFactory::CreateProject implementação para criar uma segunda instância do seu projeto, Projeto2.
As chamadas de ambiente sua IPersistFileFormat::Load implementação para abri-lo e inicializar o segundo objeto de projeto, Projeto2.
As chamadas de ambiente IVsProjectUpgrade::UpgradeProject pela segunda vez determinar se o objeto de projeto deve ser atualizado. No entanto, essa chamada é feita em um novo e em segundo lugar, a instância do projeto, Projeto2. Este é o projeto que é aberto na solução.
Dica
Na instância do que seu primeiro projeto, Projeto1, é colocado no estado inativo, em seguida, você deve retornar S_OK da primeira chamada para seu UpgradeProject implementação.Consulte Basic Project de uma implementação de IVsProjectUpgrade::UpgradeProject.
Você chamar QueryEditFiles e passe um valor de QEF_ReportOnly para o rgfQueryEdit parâmetro.
O ambiente retorna QER_EditOK e a atualização possa continuar porque o arquivo de projeto pode ser gravado.
Se você não conseguir fazer o upgrade, retornar VS_E_PROJECTMIGRATIONFAILED de IVsProjectUpgrade::UpgradeProject. Se nenhuma atualização é necessária ou se você optar por não fazer o upgrade, trate o IVsProjectUpgrade::UpgradeProject chamar como não operacional. Se você retornar VS_E_PROJECTMIGRATIONFAILED, um nó de espaço reservado é adicionado à solução para seu projeto.
Consulte também
Tarefas
Como: atualizar itens de projeto