如何使用Visual Studio將傳統桌面程序轉制為UWP程序

UWP Platform

Desktop Bridge是內置于平臺中的基礎架構,借助它,可以使用現代化的 Windows 應用包來分發Windows Forms、WPF 或 Win32 桌面應用或游戲。

優點

通過將Windows 桌面程序轉制為Windows 10 UWP應用包有下面的優點:

  • 簡化部署。使用此Desktop Bridge的應用和游戲都具有出色的部署體驗。 這體驗確保用戶可以放心地安裝應用,并對其進行更新。如果用戶選擇卸載應用,則將完全刪除它,不會留下任何痕跡。 這能減少編寫設置體驗的時間,并使用戶使用最新應用。

  • 自動更新和許可。你的應用能夠參與 Microsoft Store 的內置許可和自動更新設施。 自動更新是高度可靠和高效的機制,因為僅下載文件的已更改部分。

  • 擴大覆蓋范圍并簡化盈利過程。選擇通過 Microsoft Store進行分發可將覆蓋范圍擴大至數以百萬的 Windows10用戶,這些用戶可以通過當地支付選項獲取應用、游戲和應用內商品。

  • 添加 UWP 功能。你可以按照自己的節奏向應用的程序包添加 UWP 功能,如 XAML 用戶界面、動態磁貼更新、UWP 后臺任務、應用服務以及許多其他功能。

  • 拓展跨設備用例。通過使用橋,可以將代碼逐漸遷移到通用 Windows 平臺,以覆蓋所有的 Windows10 設備,包括手機、Xbox One 和 HoloLens。

環境需求

Desktop Bridge是在 Windows 10 版本 1607 中引入,它僅可用于面向 Windows 10 周年更新(10.0;版本 14393)Visual Studio 更高版本的項目中。

準備

開發者在將應用打包為UWP引用之前需要清理下面相關問題的代碼:

  • 你的應用使用早于 4.6.1 的 .NET 版本。 僅 .NET 4.6.1 受支持。 在進行打包之前,需要將應用重定目標到 .NET 4.6.1。

  • 應用始終使用提升的安全權限運行。 你的應用需要在以交互用戶身份運行時工作。 從 Windows 應用商店安裝應用的用戶可能不是系統管理員,因此需要應用以提升的權限運行意味著它無法為標準用戶正確運行。

  • 應用需要內核模式驅動程序或 Windows 服務。 該橋適用于應用,但不支持內核模式驅動程序或需要在系統帳戶下運行的 Windows 服務。 使用后臺任務,而不是 Windows 服務。

  • 在進程內將應用的模塊加載到不在 Windows 應用包中的進程。 不允許此操作,這意味著不支持進程中擴展,如 shell 擴展。 但是,如果你在同一個程序包中有兩個應用,則可以在它們之間執行進程間通信。

  • 應用使用自定義的應用程序用戶模型 ID (AUMID)。 如果進程調用 SetCurrentProcessExplicitAppUserModelID 以設置其自己的 AUMID,則它可能僅使用應用模型環境/Windows 應用包為其生成的 AUMID。 無法定義自定義 AUMID。

  • 應用修改 HKEY_LOCAL_MACHINE (HKLM)注冊表配置單元。 應用的任何創建 HKLM 鍵或打開一個鍵以進行修改的嘗試都會導致拒絕訪問失敗。 請記住,應用具有其自己的注冊表專用虛擬化視圖,因此用戶范圍和計算機范圍的注冊表配置單元(即 HKLM 的本質)的想法不適用。 你將需要找到另一種方法來實現 HKLM 的用途,如改為寫入 HKEY_CURRENT_USER (HKCU)

  • 應用使用 ddeexec注冊表子項作為啟動另一個應用的方式。 改為使用應用程序包清單中的各種可激活擴展配置的 DelegateExecute 謂詞處理程序之一。

  • 你的應用會寫入 AppData文件夾或注冊表,目的是與其他應用共享數據。 轉換后,AppData將重定向到本地應用數據存儲,該存儲是每個 UWP 應用的專用應用商店。

  • 你的應用將寫入 HKEY_LOCAL_MACHINE注冊表配置單元的所有條目都將重定向到隔離的二進制文件中,你的應用寫入 HKEY_CURRENT_USER注冊表配置單元的任何條目都將按用戶、按應用放入專用位置中。 有關文件和注冊表重定向的更多詳細信息,請參閱在桌面橋幕后。

  • 使用不同的進程間數據共享方式。 有關詳細信息,請參閱存儲和檢索設置以及其他應用數據。

  • 應用寫入應用的安裝目錄。 例如,應用寫入與你的 exe放置在同一個目錄中的日志文件。 此操作不受支持,因此你需要找到另一個位置,如本地應用數據存儲。

  • 應用安裝需要用戶交互。 應用安裝程序必須能夠在無提示的情況下運行,并且它必須安裝默認不在干凈操作系統映像中的所有先決條件。

  • 應用使用當前工作目錄。 在運行時,打包的桌面應用不會得到你之前在桌面 .LNK 快捷方式中指定的相同工作目錄。 如果具有正確的目錄對應用正常運行很重要,你需要在運行時更改 CWD。

  • 應用需要UIAccess。 如果應用程序在UAC清單的 requestedExecutionLevel 元素中指定UIAccess=true,則當前不支持轉換為 UWP。 有關詳細信息,請參閱 UI 自動化安全概述。

  • 應用公開COM對象。 來自程序包內的進程和擴展可以注冊并使用 COMOLE服務器,進程內和進程外 (OOP) 皆可。 創意者更新添加了打包的COM支持,它提供注冊 OOP COMOLE服務器(現在這些服務器在包外部可見)的功能。 請參閱對桌面橋的COM 服務器OLE 文檔支持。

  • 打包的 COM支持適用于現有的COM API,但不適用于依賴直接讀取注冊表的應用程序擴展,因為打包的 COM 位于一個專用位置。

  • 應用公開GAC程序集以供其他進程使用。 在當前版本中,應用無法公開 GAC 程序集以供來自 Windows 應用包外部可執行文件的進程使用。 來自程序包內的進程可以照常注冊和使用 GAC 程序集,但它們在外部將不可見。 這意味著,OLE 等互操作方案在被外部進程調用時不起作用。

  • 你的應用正以不受支持的方式鏈接C 運行時庫 (CRT)。 Microsoft C/C++ 運行時庫提供用于為 Microsoft Windows 操作系統編程的例程。 這些例程自動執行許多不采用 C 和 C++ 語言提供的常見編程任務。 如果你的應用利用 C/C++ 運行時庫,你需要確保它以受支持的方式鏈接。
    其他具體內容參考微軟官方文檔:Windows 開發中心

開始

這里以一個簡單的WPF Helllo World程序來示例。
運行環境:

  • Windows 10 1803
  • Visual Studio Professional 2017 15.7.3
  1. 新建WPF程序。
    注意,這里需要將.NET Framework的版本選擇為4.6.1以上,如果系統中沒有4.6.1以上的版本,通過Visual Studio Installer來以組件的形式安裝高版本的.NET Framework。
    新建WPF程序
  2. 填充代碼
    MainWindow.xaml文件中填寫一個Button以及其點擊的事件。
<Window x:Class="HelloWorldDemo.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:HelloWorldDemo"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Button HorizontalAlignment="Center" 
                VerticalAlignment="Center" 
                Content="Click Me" 
                Click="Button_Click"/>
    </Grid>
</Window>

MainWindow.xaml.cs中填寫View視圖中Button的邏輯事件,這里,我們簡單地將這個Button點擊事件處理為彈出一個Hello World!的消息框。

using System.Windows;

namespace HelloWorldDemo
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            MessageBox.Show("Hello World!");
        }
    }
}

  1. 打包前測試運行
    在打包為UWP程序之前,我們執行上面新建的WPF程序,效果如圖。
    測試運行

    正如我們所寫的那樣,點擊這個Button,能彈出Hello World!的消息框了。
  2. 新建UWP打包項目
    在當前的解決方案上右鍵Add->New Project,然后Windows Universal內容中選擇Windows Application Packaging Project
    [站外圖片上傳中...(image-215821-1528040900571)]
    新建打包項目

    繼續選擇Target versionMinimum version,這里以最低15063,最高17143為例子,如果選擇了系統中沒有的Windows SDK的,會提示下載SDK。
    SDK選擇
  3. 添加引用
    在新建的UWP打包項目的Applications右鍵來添加同解決方案下WPF項目的引用。
    添加引用

    添加引用
  4. 設置入口點
    Applicatons下剛添加的引用設置為入口點。
    [站外圖片上傳中...(image-6444f5-1528040900571)]
  5. 重新構建
    解決方案右鍵Rebuild啟動重新構建,一般情況下沒有出錯即可。
  6. 創建App包
    打包程序右鍵,Store->Create App Packages...,在彈出的對話框中選擇打包為Sideloading 旁加載
    [站外圖片上傳中...(image-2a47ef-1528040900571)]
    旁加載

    然后,等待打包完成。
  7. UWP測試運行
    在項目文件夾中AppPackagesWapProjTemplate_1.0.0.0_Debug_Test中可以看到,其中有cer證書文件,appxbundleUWP安裝程序文件,Add-AppDevPackage.ps1PowerShell安裝批處理,以及其他文件。
    打包

這里,右鍵這里PowerShell批處理文件,選擇使用PowerShell 運行,安裝過程中提示需要管理員權限,全部Y即可。

打包

安裝完成后即可在開始菜單看到剛打包的UWP程序,點擊運行。


PowerShell 安裝

執行效果和之前運行的一樣。

參考文獻:

  • 微軟官方開發文檔
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容