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程序,点击运行。
PowerShell 安装
执行效果和之前运行的一样。
参考文献:
- 微软官方开发文档
网友评论