Procedura: Aggiornare i sistemi di progetto
Se si modificano le informazioni salvate in modo permanente nel file di progetto tra le versioni di Visual Studio diverse del prodotto, sarà necessario supportare il miglioramento del file di progetto da precedente alla nuova versione. Per supportare l'aggiornamento che consente di in modo che prendano parte a Conversione guidata di Visual Studio, implementare l'interfaccia di IVsProjectUpgradeViaFactory . Questa interfaccia contiene l'unico meccanismo disponibile per l'aggiornamento della copia. Aggiornamento del progetto si verifica quando una parte della soluzione è aperta. L'interfaccia di IVsProjectUpgradeViaFactory viene implementata dalla factory di progetto, o deve almeno essere disponibile per la factory del progetto.
Il meccanismo obsoleto che utilizza l'interfaccia di IVsProjectUpgrade è ancora supportato, ma concettualmente aggiorna il sistema del progetto come parte del progetto aperto. Quando si utilizza CreateInstance per creare la propria istanza di annullamento amministratore, attenersi alla procedura riportata di seguito per associare il gestore di annullamento nell'ambiente. Questo approccio consente di utilizzare IVsProjectUpgradeViaFactory per implementare le parti di progetto e della copia solo aggiornamento e che delega il resto del lavoro per essere sul posto fatto (eventualmente alla nuova posizione) dall'interfaccia di IVsProjectUpgrade .
Per un'implementazione di esempio di IVsProjectUpgrade, vedere Esempi di estensibilità di Visual Studio.
Gli scenari seguenti si verificano con gli aggiornamenti di progetto:
Se il file è più recente formato che il progetto può supportare, deve restituire un errore indicante questo. Si presume che la versione precedente del prodotto, ad esempio Visual Studio .NET 2003. - includa il codice per controllare la versione.
Se il flag di PUVFF_SXSBACKUP viene specificato nel metodo di UpgradeProject , l'aggiornamento cui verrà implementato come aggiornamento sul posto prima dell'apertura del progetto.
Se il flag di PUVFF_COPYBACKUP viene specificato nel metodo di UpgradeProject , l'aggiornamento viene implementato come un aggiornamento della copia.
Se il flag di UPF_SILENTMIGRATE è specificato nella chiamata di UpgradeProject , l'utente è stato richiesto dall'ambiente di aggiornare il file di progetto come aggiornamento sul posto, dopo che il progetto viene aperto. Ad esempio, viene richiesto all'utente a migliorare quando l'utente apre una versione precedente della soluzione.
Se il flag di UPF_SILENTMIGRATE non è specificato nella chiamata di UpgradeProject , è necessario chiedere a l aggiornare il file di progetto.
Ecco un messaggio rapido di aggiornamento di esempio:
“Progetto “%1 " è stato creato con una versione precedente di Visual Studio. Se lo si apre con questa versione di Visual Studio, non è possibile aprirlo con le versioni precedenti di Visual Studio. Si desidera continuare e aprire il progetto?„
Per implementare IVsProjectUpgradeViaFactory
Implementare il metodo dell'interfaccia di IVsProjectUpgradeViaFactory , in particolare il metodo di UpgradeProject implementazione della factory di progetto, o rendere le implementazioni chiamati dall'implementazione della factory del progetto.
Se si desidera eseguire un aggiornamento sul posto come parte dell'apertura della soluzione, fornire il flag PUVFF_SXSBACKUP come parametro di VSPUVF_FLAGS nell'implementazione di UpgradeProject .
Se si desidera eseguire un aggiornamento sul posto come parte dell'apertura della soluzione, fornire il flag PUVFF_COPYBACKUP come parametro di VSPUVF_FLAGS nell'implementazione di UpgradeProject .
Per entrambi i passaggi 2 e 3, i passaggi di aggiornamento del file, utilizzando IVsQueryEditQuerySave2, possono essere distribuiti come descritto in “implementando nella sezione di IVsProjectUpgade„ riportata di seguito, oppure è possibile delegare effettivo aggiornamento del file IVsProjectUpgrade.
Utilizzare i metodi di IVsUpgradeLogger per inserire i messaggi correlati aggiornamento per l'utente che utilizza la migrazione guidata di Visual Studio.
l'interfaccia diIVsFileUpgrade viene utilizzata per implementare qualsiasi tipo di aggiornamento del file che deve verificarsi come parte di aggiornamento del progetto. Questa interfaccia non viene chiamata da IVsProjectUpgradeViaFactory, ma viene fornita come un meccanismo per aggiornare i file che fanno parte del sistema del progetto, ma il sistema del progetto principale non può essere direttamente a conoscenza di. Ad esempio, questa situazione potrebbe verificarsi se i file e le proprietà correlate compilatore non sono gestiti dallo stesso team di sviluppo che gestisce il resto del sistema del progetto.
implementazione di IVsProjectUpgrade
Se il sistema del progetto implementa IVsProjectUpgrade solo, non può partecipare a Conversione guidata di Visual Studio. Tuttavia, anche se si implementa l'interfaccia di IVsProjectUpgradeViaFactory , è comunque possibile delegare l'aggiornamento del file l'implementazione di IVsProjectUpgrade .
Per implementare IVsProjectUpgrade
Quando un utente tenta di aprire un progetto, il metodo di UpgradeProject viene chiamato dall'ambiente dopo il progetto verrà aperto e prima di qualsiasi altra azione utente possa essere utilizzata nel progetto. Se l'utente è già stato richiesto di aggiornare la soluzione, il flag di UPF_SILENTMIGRATE viene passato nel parametro di grfUpgradeFlags . Se l'utente apre direttamente un progetto, ad esempio tramite il comando di Aggiungere un progetto esistente , quindi il flag di UPF_SILENTMIGRATE non superati e le necessità di progetto possibile chiedere all'aggiornamento.
In risposta alla chiamata di UpgradeProject , il progetto deve valutare se il file di progetto viene aggiornato. Se il progetto non necessario aggiornare il tipo di progetto a una nuova versione, pertanto può restituire semplicemente il flag di S_OK .
Se le necessità di progetto di aggiornare il tipo di progetto a una nuova versione, quindi necessario determinare se il file di progetto può essere modificato chiamando il metodo di QueryEditFiles e passando un valore di QEF_ReportOnly per il parametro di rgfQueryEdit . Il progetto deve quindi eseguire le operazioni seguenti:
Se il valore di VSQueryEditResult restituito nel parametro di pfEditCanceled è QER_EditOK, l'aggiornamento può continuare poiché il file di progetto può essere scritto.
Se il valore di VSQueryEditResult restituito nel parametro di pfEditCanceled è QER_EditNotOK e il valore di VSQueryEditResult ha il bit di QER_ReadOnlyNotUnderScc impostato, quindi UpgradeProject deve restituire l'errore, poiché gli utenti devono risolvere le autorizzazioni si pubblicano. Il progetto deve eseguire le operazioni seguenti:
Riferire l'errore all'utente chiamando ReportErrorInfo. e restituire il codice di errore VS_E_PROJECTMIGRATIONFAILED a IVsProjectUpgrade.
If the VSQueryEditResult value is QER_EditNotOK and the VSQueryEditResultFlags value has the QER_ReadOnlyUnderScc bit set, then the project file should be checked out by calling QueryEditFiles (QEF_ForceEdit_NoPrompting, QEF_DisallowInMemoryEdits,...).
Se la chiamata di QueryEditFiles nel file di progetto nel file venga verificata e la versione più recente da recuperare, il progetto viene scaricato e ricaricato. Il metodo di UpgradeProject viene chiamato nuovamente dopo un'altra istanza del progetto viene creata. Nella seconda chiamata, il file di progetto può essere scritto sul disco, è importante che i salvataggio del progetto una copia del file di progetto nel formato precedente con estensione .OLD, apportare le modifiche necessarie di aggiornamento e salvare il file di progetto nel nuovo formato. Nuovamente, se una parte del processo di aggiornamento si verifica, il metodo deve indicare l'errore restituendo VS_E_PROJECTMIGRATIONFAILED. In questo modo il progetto essere in Esplora soluzioni scaricato.
È importante comprendere l'intero processo che si verifica nell'ambiente per il caso in cui la chiamata al metodo di QueryEditFiles (che specifica un valore di ReportOnly) restituisce QER_EditNotOK e i flag di QER_ReadOnlyUnderScc .
l'utente tenta di aprire il file di progetto.
L'ambiente viene chiamata l'implementazione di CanCreateProject .
Se CanCreateProject restituisce true, nell'ambiente viene chiamata l'implementazione di CanCreateProject .
L'ambiente viene chiamata l'implementazione di Load per aprire il file e per inizializzare l'oggetto del progetto, ad esempio, Project1.
L'ambiente viene chiamata l'implementazione di IVsProjectUpgrade::UpgradeProject per determinare se il file di progetto deve essere aggiornato.
Chiamate l'entity_M:Microsoft.VisualStudio.Shell.Interop.IVsQueryEditQuerySave2.QueryEditFiles(System.UInt32, System.Int32, System.String[], System.UInt32[], Microsoft.VisualStudio.Shell.Interop.VSQEQS_FILE_ATTRIBUTE_DATA[], System.UInt32@, System.UInt32@) e si passa
L'ambiente restituisce QER_EditNotOK per VSQueryEditResult e il bit di QER_ReadOnlyUnderScc viene impostato in VSQueryEditResultFlags.
l'implementazione di IVsProjectUpgrade chiama IVsQueryEditQuerySave::QueryEditFiles (QEF_ForceEdit_NoPrompting, QEF_DisallowInMemoryEdits).
Questa chiamata può causare una nuova copia del file di progetto a essere verificato e della versione più recente recuperata nonché una necessità ricaricare il file di progetto. In questa fase, una di due elementi si verifica l'evento:
Se si gestisce la propria ricaricamento del progetto, nell'ambiente viene chiamata l'implementazione di ReloadItem (VSITEMID_ROOT). Quando si riceve questa chiamata, ricaricare la prima istanza del progetto (Project1) e continuare a migliorare il file di progetto. L'ambiente corrente che gestisce la propria ricaricamento del progetto viene restituito true per GetProperty (VSHPROPID_HandlesOwnReload).
Se non si gestisce la propria ricaricamento del progetto, quindi restituire false per GetProperty (VSHPROPID_HandlesOwnReload). In questo caso, prima del completamento di QueryEditFiles(QEF_ForceEdit_NoPrompting, QEF_DisallowInMemoryEdits,), l'ambiente viene creato un altro, l'istanza del progetto, ad esempio, Project2, come segue:
L'ambiente chiama Close il primo oggetto del progetto, Project1, così da questo oggetto nello stato inattivo.
L'ambiente viene chiamata l'implementazione di IVsProjectFactory::CreateProject per creare una seconda istanza del progetto, Project2.
L'ambiente viene chiamata l'implementazione di IPersistFileFormat::Load per aprire il file e inizializzare il secondo oggetto del progetto, Project2.
L'ambiente chiama GetCfgs, che restituisce un elenco di puntatori IVsCfg che è possibile utilizzare per ottenere i nomi visualizzati per le informazioni di configurazione e di piattaforma da elencati nell'interfaccia utente dell'ambiente. Tuttavia, questa chiamata viene eseguita in un nuovo, il secondo, l'istanza del progetto, Project2. Si tratta del progetto aperto nella soluzione.
Nota
Nell'istanza che il primo progetto, Project1, viene posizionato nello stato inattivo, quindi si deve restituire S_OK dalla prima chiamata all'implementazione di UpgradeProject .Vedere Basic Project per l'implementazione di IVsProjectUpgrade::UpgradeProject.
Chiamate l'entity_M:Microsoft.VisualStudio.Shell.Interop.IVsQueryEditQuerySave2.QueryEditFiles(System.UInt32, System.Int32, System.String[], System.UInt32[], Microsoft.VisualStudio.Shell.Interop.VSQEQS_FILE_ATTRIBUTE_DATA[], System.UInt32@, System.UInt32@) e si passa
Restituisce QER_EditOK dell'ambiente e l'aggiornamento possono continuare poiché il file di progetto può essere scritto.
Se non si riesce a migliorare, VS_E_PROJECTMIGRATIONFAILED da IVsProjectUpgrade::UpgradeProject. In assenza di un aggiornamento o si sceglie di non aggiornare, considerare la chiamata di IVsProjectUpgrade::UpgradeProject la funzione viene definita operazione no-op. Se viene restituito VS_E_PROJECTMIGRATIONFAILED, un nodo segnaposto viene aggiunto alla soluzione per il progetto.
Vedere anche
Attività
Procedura: Aggiornare gli elementi di progetto