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
。
- 填充代码
在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
。
- 添加引用
在新建的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程序,点击运行。
执行效果和之前运行的一样。
参考文献:
- 微软官方开发文档