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
對象。 來自程序包內的進程和擴展可以注冊并使用COM
和OLE
服務器,進程內和進程外 (OOP) 皆可。 創意者更新添加了打包的COM
支持,它提供注冊OOP COM
和OLE
服務器(現在這些服務器在包外部可見)的功能。 請參閱對桌面橋的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
- 新建
WPF
程序。
注意,這里需要將.NET Framework
的版本選擇為4.6.1
以上,如果系統中沒有4.6.1
以上的版本,通過Visual Studio Installer
來以組件的形式安裝高版本的.NET Framework
。
新建WPF程序 - 填充代碼
在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!");
}
}
}
- 打包前測試運行
在打包為UWP
程序之前,我們執行上面新建的WPF
程序,效果如圖。
測試運行
正如我們所寫的那樣,點擊這個Button
,能彈出Hello World!
的消息框了。 - 新建UWP打包項目
在當前的解決方案上右鍵Add
->New Project
,然后Windows Universal
內容中選擇Windows Application Packaging Project
。
[站外圖片上傳中...(image-215821-1528040900571)]
新建打包項目
繼續選擇Target version
和Minimum version
,這里以最低15063
,最高17143
為例子,如果選擇了系統中沒有的Windows SDK
的,會提示下載SDK
。
SDK選擇 - 添加引用
在新建的UWP
打包項目的Applications
右鍵來添加同解決方案下WPF項目的引用。
添加引用
添加引用 - 設置入口點
將Applicatons
下剛添加的引用設置為入口點。
[站外圖片上傳中...(image-6444f5-1528040900571)] - 重新構建
解決方案右鍵Rebuild
啟動重新構建,一般情況下沒有出錯即可。 - 創建App包
打包程序右鍵,Store
->Create App Packages...
,在彈出的對話框中選擇打包為Sideloading 旁加載
[站外圖片上傳中...(image-2a47ef-1528040900571)]
旁加載
然后,等待打包完成。 - UWP測試運行
在項目文件夾中AppPackages
的WapProjTemplate_1.0.0.0_Debug_Test
中可以看到,其中有cer
證書文件,appxbundle
UWP安裝程序文件,Add-AppDevPackage.ps1
PowerShell安裝批處理,以及其他文件。
打包
這里,右鍵這里PowerShell
批處理文件,選擇使用PowerShell 運行
,安裝過程中提示需要管理員權限,全部Y
即可。
安裝完成后即可在開始菜單看到剛打包的UWP程序,點擊運行。
執行效果和之前運行的一樣。
參考文獻:
- 微軟官方開發文檔