如果您決定將傳統型應用程式封裝在 MSIX 套件中(請參閱 從程式代碼建置 MSIX 套件),您可以將已封裝的應用程式發佈至 Microsoft 市集,或將它側載至一或多個裝置。
備註
您是否有計劃如何將使用者轉換至已封裝的應用程式? 在您發行應用程式之前,請參閱本指南的 過渡用戶至已封裝應用程式 一節,以獲取靈感。
將您的應用程式發佈至 Microsoft 市集
Microsoft市集是客戶取得您 app 的便利方式。
將您的應用程式發佈至 Microsoft 商店,以接觸最廣泛的觀眾。 此外,組織客戶也可以取得您的應用程式,透過商務用 Microsoft Store,在內部散發給組織。
如果您打算發佈至 Microsoft 商店,在提交過程中會詢問一些額外的問題。 這是因為您的套件指令清單會宣告名為 runFullTrust 的受限制功能,而我們需要核准您的應用程式使用該功能。 您可以在這裡深入瞭解此需求: 受限制的功能。
您不需要在將應用程式提交到商店之前簽署它。
這很重要
如果您打算將應用程式發佈至 Microsoft 市集,請確定您的應用程式在執行 Windows 10 S 或 Windows 11 S 的裝置上正常運作。這是市集需求。 請參閱 測試適用於 Windows 10 S 或 Windows 11 S 的 Windows 應用程式。
發佈您的應用程式,而不將它放在 Microsoft Store
如果您想要在不使用市集的情況下散發應用程式,您可以手動將應用程式散發到一或多個裝置。
如果您想要更充分掌控散發體驗,或不想參與Microsoft市集認證程式,這可能很合理。
若要將應用程式散發到其他裝置,而不將其放在市集中,您必須取得憑證、使用該憑證簽署您的應用程式,然後將您的應用程式側載至這些裝置。
您可以 建立憑證 ,或從 Verisign 等熱門廠商取得憑證。
如果您打算將應用程式散發到執行 Windows 10 S 或 Windows 11 S 的裝置上,您的應用程式必須由 Microsoft 市集簽署,因此您必須先完成市集提交程式,才能將應用程式散發到這些裝置。
如果您建立憑證,則必須將它安裝到執行您應用程式的每個裝置的 受信任的根,或 受信任的使用者 證書存儲中。 如果您從熱門廠商取得憑證,除了您的應用程式之外,您不需要將任何專案安裝到其他系統上。
這很重要
請確定憑證上的發行者名稱符合您應用程式的發行者名稱。
若要使用憑證簽署您的應用程式,請參閱 使用 SignTool 簽署應用程式套件。
若要將應用程式側載至其他裝置,請參閱在 Windows中
將用戶轉換至已封裝的應用程式
在您散發應用程式之前,請考慮在套件指令清單中新增一些延伸模組,以協助用戶習慣使用已封裝的應用程式。 以下是一些您可以做的事項。
- 將現有的 [開始] 磚和任務列按鈕指向已封裝的應用程式。
- 將封裝的應用程式與一組檔案類型產生關聯。
- 讓您的封裝應用程式預設會開啟特定類型的檔案。
如需延伸模組的完整清單和如何使用它們的指引,請參閱 將用戶轉換至您的應用程式。
此外,請考慮將程式代碼新增至已封裝的應用程式,以完成下列工作:
- 將與您桌面應用程式相關的用戶資料遷移至封裝應用程式的適當資料夾位置。
- 提供使用者卸載應用程式桌面版本的選項。
讓我們來談談這些任務的每一項。 我們將從用戶數據遷移開始。
移轉用戶數據
如果您要新增移轉用戶數據的程式代碼,最好只在應用程式第一次啟動時執行該程序代碼。 在移轉用戶數據之前,請先向用戶顯示對話框,說明所發生的情況、建議的原因,以及其現有數據會發生什麼情況。
以下是如何在以 .NET 為基礎的已封裝應用程式中執行這項作業的範例。
private void MigrateUserData()
{
String sourceDir = Environment.GetFolderPath
(Environment.SpecialFolder.ApplicationData) + "\\AppName";
if (sourceDir != null)
{
DialogResult migrateResult = MessageBox.Show
("Would you like to migrate your data from the previous version of this app?",
"Data Migration", MessageBoxButtons.YesNo);
if (migrateResult.Equals(DialogResult.Yes))
{
String destinationDir =
Windows.Storage.ApplicationData.Current.LocalFolder.Path + "\\AppName";
Process process = new Process();
process.StartInfo.FileName = "robocopy.exe";
process.StartInfo.Arguments = "%LOCALAPPDATA%\\AppName " + destinationDir + " /move";
process.StartInfo.CreateNoWindow = true;
process.Start();
process.WaitForExit();
if (process.ExitCode > 1)
{
//Migration was unsuccessful -- you can choose to block/retry/other action
}
}
}
}
卸載您應用程式的桌面版本
最好不要在沒有先徵得他們的同意的情況下,卸載用戶的桌面應用程式。 顯示對話框,詢問使用者該許可權。 使用者可能會決定不要卸載您應用程式的桌面版本。 如果發生這種情況,您必須決定是否要封鎖使用桌面應用程式,還是支援兩個應用程式同時運行。
以下是如何在以 .NET 為基礎的已封裝應用程式中執行這項作業的範例。
若要檢視此代碼段的完整內容,請參閱此範例的 MainWindow.cs 檔案,WPF 圖片檢視器與轉換/移轉/卸載。
private void RemoveDesktopApp()
{
//Typically, you can find your uninstall string at this location.
String uninstallString = (String)Microsoft.Win32.Registry.GetValue
(@"HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion" +
@"\Uninstall\{7AD02FB8-B85E-44BC-8998-F4803BA5A0E3}\", "UninstallString", null);
//Detect if the previous version of the Desktop application is installed.
if (uninstallString != null)
{
DialogResult uninstallResult = MessageBox.Show
("To have the best experience, consider uninstalling the "
+ " previous version of this app. Would you like to do that now?",
"Uninstall the previous version", MessageBoxButtons.YesNo);
if (uninstallResult.Equals(DialogResult.Yes))
{
string[] uninstallArgs = uninstallString.Split(' ');
Process process = new Process();
process.StartInfo.FileName = uninstallArgs[0];
process.StartInfo.Arguments = uninstallArgs[1];
process.StartInfo.CreateNoWindow = true;
process.Start();
process.WaitForExit();
if (process.ExitCode != 0)
{
//Uninstallation was unsuccessful - You can choose to block the application here.
}
}
}
}
後續步驟
有問題嗎? 歡迎在我們的 技術社群上詢問。
如果您遇到將應用程式發佈至市集的問題,此 部落格文章 包含一些有用的秘訣。