How to: 升級專案系統
如果您變更資訊保存在不同的 Visual Studio 版本,您的產品,將專案檔案,那麼您需要支援從舊專案檔升級為新的版本。 若要支援升級,可讓您參與 Visual Studio 的轉換精靈,實作IVsProjectUpgradeViaFactory介面。 這個介面會包含可用的升級複本的機制。 專案的升級,就會發生在當開啟方案的一部分。 IVsProjectUpgradeViaFactory介面實作專案處理站,或應該最少需要從專案工廠。
舊用的機制的IVsProjectUpgrade介面仍受支援,但在概念上將專案系統升級為開啟專案的一部分。 IVsProjectUpgrade介面因此由呼叫Visual Studio環境,即使IVsProjectUpgradeViaFactory呼叫或實作介面。 這種方法可讓您使用IVsProjectUpgradeViaFactory實作複製和專案僅部分升級,和其他要完成就地升級 (可能是最新的位置) 的工作來委派IVsProjectUpgrade介面。
實作範例的IVsProjectUpgrade,請參閱Visual Studio 的擴充性範例。
下列案例會產生專案升級:
如果檔案屬於非專案可支援較新的格式,它必須傳回錯誤,這表示。 本範例假設您產品的較舊的版本 — 例如,Visual Studio。NET 2003 中,包含要檢查之版本的程式碼。
如果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參數。 如果使用者開啟的專案直接,這種為使用加入現有專案命令,然後在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專案 1 開啟檔案,並起始專案物件,例如,若要實作。
環境呼叫您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) 實作。 當您收到這項呼叫時,請重新載入專案 (專案 1) 的第一個執行個體,並繼續升級您的專案檔。 您處理的是您自己的專案重新載入,是否您的環境知道true的GetProperty (VSHPROPID_HandlesOwnReload)。
如果您不會處理您的專案重新載入,則傳回false的GetProperty (VSHPROPID_HandlesOwnReload)。 如此一來之前, QueryEditFiles(QEF_ForceEdit_NoPrompting, QEF_DisallowInMemoryEdits,) 傳回時,環境就會建立另一個新的您的專案,例如,Project2 的執行個體,如下所示:
環境呼叫Close您第一個專案,在物件上專案 1,因此置於此物件的非作用中狀態。
環境呼叫您IVsProjectFactory::CreateProject實作來建立您的專案,Project2 的第二個執行個體。
環境呼叫您IPersistFileFormat::Load開啟的檔案,並初始化第二個專案物件,Project2 的實作。
環境呼叫IVsProjectUpgrade::UpgradeProject的第二次來判斷是否應該升級專案物件。 不過,這個呼叫後上新的第二,專案中,Project2 的執行個體。 這是在方案中開啟的專案。
注意事項 第一個專案,專案 1,會處於非作用中狀態,則您必須傳回的執行個體中S_OK ,第一個呼叫您UpgradeProject實作。請參閱Basic Project實作的IVsProjectUpgrade::UpgradeProject。
您呼叫QueryEditFiles ,並傳遞值為QEF_ReportOnly的rgfQueryEdit參數。
傳回環境QER_EditOK ,因為在寫入專案檔,可以繼續升級。
如果您無法升級,會傳回VS_E_PROJECTMIGRATIONFAILED的IVsProjectUpgrade::UpgradeProject。 如果不不需要任何升級,或您選擇不要升級,將IVsProjectUpgrade::UpgradeProject呼叫以執行任何作業。 如果要傳回VS_E_PROJECTMIGRATIONFAILED,版面配置區節點加入至專案的方案。