Freigeben über


Gewusst wie: Upgrade-Projektsysteme

Wenn Sie die Daten ändern, die in der Projektdatei zwischen verschiedenen Visual Studio-Versionen des Produkts beibehalten werden, müssen Sie das Aktualisieren der Projektdatei aus dem alten auf die neue Version unterstützen. Zur Unterstützung der Aktualisierung der Sie die Teilnahme an Visual Studio-Konvertierungs-AssistentImplementieren Sie die IVsProjectUpgradeViaFactory-Schnittstelle. Diese Schnittstelle enthält den einzigen Mechanismus, der für Kopienaktualisierung verfügbar ist. Die Aktualisierung des Projekts eintritt, während ein Teil der Projektmappe geöffnet wird. Die Schnittstelle wird durch die IVsProjectUpgradeViaFactory factory Projekt implementiert oder factory des Projekts sollte mindestens erreichbar ist.

Der alte Mechanismus, der die IVsProjectUpgrade-Schnittstelle verwendet, wird jedoch weiterhin unterstützt, während das Projektsystem konzeptionell Teil des geöffneten Projekts aktualisiert. Die IVsProjectUpgrade-Schnittstelle wird deshalb durch die Visual Studio Umgebung aufgerufen, selbst wenn die IVsProjectUpgradeViaFactory-Schnittstelle aufgerufen oder implementiert wird. Dieser Ansatz ermöglicht es Ihnen, IVsProjectUpgradeViaFactory zu verwenden, um die Kopieren und Projekt nur Teile des Upgrades zu implementieren und delegiert die restliche Arbeit, um am neuen Speicherort) (möglicherweise durch die IVsProjectUpgrade-Schnittstelle erfolgt direkt zu sein.

Für eine Beispiel finden Sie unter IVsProjectUpgradeImplementierung von Visual Studio-Erweiterbarkeits-Beispiele.

Die folgenden Szenarien können mit Projekt upgraden:

  • Wenn die Datei von einer neueren Format ist als das Projekt unterstützen kann, muss er einen Fehler zurückgeben, der dieses angibt. Dabei wird davon ausgegangen, dass die frühere Version des Produkts, z. B. Visual Studio .NET 2003 — Code enthält, der für die Version zu überprüfen.

  • Wenn das Flag in der PUVFF_SXSBACKUPUpgradeProject-Methode angegeben wird, werden die Upgrades als ein direktes Upgrade vor dem Starttag des Projekts implementiert werden.

  • Wenn das Flag in der PUVFF_COPYBACKUPUpgradeProject-Methode angegeben wird, werden das Upgrade während Kopien Migrationsupgrade implementiert.

  • Wenn das Flag im UPF_SILENTMIGRATEUpgradeProject Aufruf angegeben wird, dann kann der Benutzer von der Umgebung aufgefordert, die Projektdatei als ein direktes Upgrade zu aktualisieren, nachdem das Projekt geöffnet wird. Zum Beispiel erfordert die Umgebung den Benutzer zu aktualisieren, wenn der Benutzer eine frühere Version der Projektmappe geöffnet.

  • Wenn das UPF_SILENTMIGRATE-Flag nicht im UpgradeProject Aufruf angegeben wird, dann müssen Sie den Benutzer auffordern, die Projektdatei zu aktualisieren.

    Im Folgenden finden Sie eine sofortige Meldung der Beispiels Migrationsupgrade:

    „Das Projekt „%1 " wurde mit einer früheren Version von Visual Studio erstellt wird. Wenn Sie sich mit dieser Version von Visual Studio öffnen, sind Sie möglicherweise nicht in der Lage, die mit früheren Versionen von Visual Studio zu öffnen. Möchten Sie dieses Projekt öffnen und fortfahren?“

So implementieren IVsProjectUpgradeViaFactory

  1. Implementieren Sie die Methode der IVsProjectUpgradeViaFactory-Schnittstelle, die speziell UpgradeProject-Methode in der Implementierung des Projekts factory, oder legen Sie die Implementierungen aufgerufen werden von der Implementierung des Projekts factory.

  2. Wenn Sie ein direktes Upgrade als Teil der Lösung öffnung durchführen möchten, geben Sie das Flag PUVFF_SXSBACKUP als VSPUVF_FLAGS-Parameter in der Implementierung der UpgradeProject an.

  3. Wenn Sie ein direktes Upgrade als Teil der Lösung öffnung durchführen möchten, geben Sie das Flag PUVFF_COPYBACKUP als VSPUVF_FLAGS-Parameter in der Implementierung der UpgradeProject an.

  4. Für beide die Schritte 2 und 3, können die tatsächlichen Schritte Migrationsupgrade Datei mit IVsQueryEditQuerySave2implementiert werden, wie im IVsProjectUpgade„Implementierung“ weiter unten beschrieben. Sie können auch die eigentliche Datei Migrationsupgrade auf IVsProjectUpgradedelegieren.

  5. Verwenden Sie die Methoden von IVsUpgradeLogger , um ein Upgrade verknüpfte Meldungen für den Benutzer zu übermitteln, der Visual Studio-Migrations-Assistenten verwendet.

  6. IVsFileUpgrade-Schnittstelle wird verwendet, um eine beliebige Art von Datei Migrationsupgrade zu implementieren, die als Teil des Projekts Migrationsupgrade der Fall sein muss. Diese Schnittstelle wird nicht vom IVsProjectUpgradeViaFactoryaufgerufen, wird jedoch als Mechanismus bereitgestellt, um Dateien zu aktualisieren, die Teil des Projektsystems sind, aber das zentrale Projektsystem kann nicht direkt darüber im Klaren sein. Diese Situation kann beispielsweise auftreten, wenn der Compiler keine Eigenschaften und zugehörige Dateien vom selben Entwicklungsteam behandelt werden, die den Rest des Projektsystems behandelt.

IVsProjectUpgrade-Implementierung

Wenn das Projektsystem nur IVsProjectUpgrade implementiert, es kann keine Verbindung mit Visual Studio-Konvertierungs-Assistentteilnehmen. Auch wenn Sie die IVsProjectUpgradeViaFactory-Schnittstelle implementieren, können Sie die Datei Migrationsupgrade auf IVsProjectUpgrade Implementierung noch delegieren.

So implementieren IVsProjectUpgrade

  1. Wenn ein Benutzer versucht, ein Projekt zu öffnen, wird die UpgradeProject-Methode von der Umgebung aufgerufen, nachdem das Projekt geöffnet wurde und bevor eine beliebige andere Benutzeraktion auf das Projekt ausgeführt werden kann. Wenn der Benutzer bereits aufgefordert wurde, um die Projektmappe zu aktualisieren, wird das UPF_SILENTMIGRATE-Flag in den grfUpgradeFlags-Parameter übergeben. Wenn der Benutzer ein Projekt direkt geöffnet, wie mithilfe des Vorhandenes Projekt hinzufügen Befehl verwendet, das UPF_SILENTMIGRATE-Flag nicht übergeben wird und das Projekt muss den Benutzer auffordern zu aktualisieren.

  2. Als Reaktion auf den UpgradeProject Aufruf muss das Projekt ergeben, ob die Projektdatei aktualisiert wird. Wenn das Projekt nicht um den Projekttyp auf eine neue Version zu aktualisieren, kann es das S_OK-Flag nur zurückgeben.

  3. Wenn es sich bei dem Projekt um den Projekttyp auf eine neue Version aktualisiert werden muss, muss sie ermitteln, ob die Projektdatei geändert werden kann, indem die QueryEditFiles-Methode aufgerufen wird und einen Wert von QEF_ReportOnly für den rgfQueryEdit-Parameter übergeben wird. Das Projekt muss dann wie folgt vor:

  4. Wenn der Aufruf QueryEditFiles in der Projektdatei die Datei ausgecheckt wird und die abzurufenden neueste Version, wird das Projekt entladen und erneut geladen. Die UpgradeProject-Methode wird erneut aufgerufen, sobald eine andere Instanz des Projekts erstellt wird. In diesem zweiten Aufruf kann die Projektdatei auf einen Datenträger geschrieben werden. Es wird empfohlen, dass das Projekt abwehr eine Kopie der Projektdatei im vorherigen Format mit einer .OLD-Erweiterung die notwendigen Änderungen vornimmt, Upgrade und die Projektdatei im neuen Format gespeichert werden. Auch wenn überhaupt schlägt der Teil des Aktualisierungsvorgangs ausgeführt, muss die Methode angeben, indem sie VS_E_PROJECTMIGRATIONFAILEDFehler zurückgibt. Dadurch wird das Projekt entladen genommener im Projektmappen-Explorer angezeigt werden soll.

    Es ist wichtig, den gesamten Prozess zu verstehen, der in der Umgebung für den Fall eintritt, in dem der Aufruf der QueryEditFiles (Methode) ReportOnly einen Wert aus QER_EditNotOK und die QER_ReadOnlyUnderScc-Flags zurückgibt.

  5. Der Benutzer versucht, die Projektdatei zu öffnen.

  6. Die Umgebung wird die Implementierung CanCreateProject an.

  7. Wenn CanCreateProjecttruezurückgibt, ruft die Implementierung CanCreateProject die Umgebung an.

  8. Die Umgebung wird die Load Implementierung an, um die Datei zu öffnen und das Projektobjekt z. B. " Project1 " zu initialisieren.

  9. Die Umgebung wird die IVsProjectUpgrade::UpgradeProject Implementierung auf, um zu bestimmen, ob die Projektdatei aktualisiert werden muss.

  10. Sie rufen QueryEditFiles auf, und übergeben QEF_ReportOnly in einen Wert für den Parameter rgfQueryEdit .

  11. Die Umgebung wird QER_EditNotOK für VSQueryEditResult zurück und das QER_ReadOnlyUnderScc Bit wird in VSQueryEditResultFlagsfestgelegt.

  12. Die IVsProjectUpgrade Implementierung ruft IVsQueryEditQuerySave::QueryEditFiles (QEF_ForceEdit_NoPrompting, QEF_DisallowInMemoryEdits).

Dieser Aufruf wird möglicherweise eine neue Kopie der Projektdatei ausgecheckt und der abgerufenen worden neuesten Version sowie eine Anforderung, die Projektdatei erneut zu laden. An diesem Punkt werden eine von zwei Dinge:

  • Wenn Sie behandeln, besitzen Projekt umladen, ruft die Implementierung der Umgebung ReloadItem (VSITEMID_ROOT) an. Wenn Sie diesen Aufruf erhalten, erneut laden Sie die erste Instanz des Projekts (" Project1 ") und setzen Sie das Aktualisieren der Projektdatei fort. Die Umgebung weiß, dass Sie besitzen Projektumladen behandeln, wenn Sie true für GetProperty (VSHPROPID_HandlesOwnReload) zurückgeben.

  • Wenn Sie nicht behandeln Projekt umladen besitzen, geben Sie false für GetProperty zurück (VSHPROPID_HandlesOwnReload). In diesem Fall vor QueryEditFiles(QEF_ForceEdit_NoPrompting, QEF_DisallowInMemoryEdits) gibt, erstellt die Umgebung ein weiteres neues Instanz des Projekts z Project2 zurück wie folgt:

    1. Die Umgebung wird Close auf dem ersten Projektobjekt, und somit auf Project1 sich dieses Objekt im inaktiven Zustand.

    2. Die Umgebung wird die IVsProjectFactory::CreateProject Implementierung auf, um eine zweite Instanz des Projekts, Project2 zu erstellen.

    3. Die Umgebung wird die IPersistFileFormat::Load Implementierung auf, um die Datei zu öffnen und das zweite Projektobjekt, Project2 zu initialisieren.

    4. Die Umgebung wird IVsProjectUpgrade::UpgradeProject während eines zweiten zu bestimmen Mals an, ob das Projektobjekt aktualisiert werden soll. Allerdings wird dieser Aufruf eines neuen, Sekunde Instanz des Projekts, Project2 gemacht. Dies ist das Projekt in der Projektmappe geöffnet ist.

      Hinweis

      In der Instanz, die das erste Projekt Project1, in den inaktiven Status versetzt wird, müssen Sie in S_OK aus dem ersten Aufruf der UpgradeProject Implementierung zurückgeben.Weitere Informationen finden Sie unter Basic Project für eine Implementierung von IVsProjectUpgrade::UpgradeProject.

    5. Sie rufen QueryEditFiles auf, und übergeben QEF_ReportOnly in einen Wert für den Parameter rgfQueryEdit .

    6. Die Umgebung wird QER_EditOK zurück, und die Upgrades können fortgesetzt werden, da die Projektdatei geschrieben werden kann.

Wenn Sie nicht aktualisieren können, geben VS_E_PROJECTMIGRATIONFAILED von IVsProjectUpgrade::UpgradeProject. Wenn keine Upgrade erforderlich ist, oder Sie nicht aktualisieren, behandeln Sie den IVsProjectUpgrade::UpgradeProject Aufruf als No-Op. Wenn Sie VS_E_PROJECTMIGRATIONFAILEDKnoten zurückgeben, wird ein Platzhalter für das Projekt zur Projektmappe hinzugefügt.

Siehe auch

Aufgaben

Gewusst wie: Upgrade-Projektelemente

Weitere Ressourcen

Visual Studio Conversion Wizard

Projekte (Visual Studio SDK)