《迁移桌面程序到MS Store(8)——通过APPX下载Win32Component》中我们讨论了通过APPX来下载Service部分的安装包。但是纯UWP的客户端并不能自动运行下载的exe或者msi文件。本篇将着手解决这个问题。
假设我们有如下结构的application,蓝色APPX中包含UWP及.NET Standard Libraries。而Service部分以WCF的形式Host在Windows Service上,这其中包含了诸如Win32 API等无法迁移到UWP的内容。

因为用户不愿除了从MS Store下载外,再额外手动下载Service部分的安装包。所以我们希望在APPX中,包含额外的exe或msi安装包,通过Packaging工程的形式来打包成APPX,结构图如下所示,绿色UWP Client包含了UWP UI及.NET Standard Libraries,而Service部分直接以exe或msi形式嵌入。

样例代码放在全球最大的同性交友平台GitHub:
https://github.com/manupstairs/AppxWithDesktopExtension
也可以去MS Store试下成品:
https://www.microsoft.com/store/productid/9N22D8RLKZN2
首先看AppWithDesktopExtension1文件夹,由三个工程组成。

UWPClient是一个标准的UWP工程,该工程仅有一个Button按钮,在点击该按钮后,去启动DotNetConsoleApp.exe程序。

  1. private async void Button_Click(object sender, RoutedEventArgs e)
  2. {
  3. if (ApiInformation.IsApiContractPresent("Windows.ApplicationModel.FullTrustAppContract", , ))
  4. {
  5. await FullTrustProcessLauncher.LaunchFullTrustProcessForCurrentAppAsync();
  6. }
  7. }

默认的UWP工程的references中是不包含ApiInformation类及FullTrustProcessLauncher类的。这里我们需要添加Windows Desktop Extensions for the UWP的引用。

UWPClient本身并不能包含exe或者Win32App的工程,所以我们还是需要通过Packaging工程来同时包含二者。首先在AppxWithDesktopExtension工程的Applications中添加UWPClient的引用。然后再将生成好的DotNetConsoleApp.exe拷贝到AppxWithDesktopExtesion工程。假设该exe文件是一个installer文件,所以我们不是添加工程的reference而是直接添加该exe文件。

这里有个需要注意的地方是,建议建一个同名文件夹放置exe文件。直接添加exe到根目录的话,我在提交商店预处理的时候遇到“DotNetConsoleApp.exe“ doesn't exist in the package的错误,我有理由相信这是某软对路径的判断没处理好,但是咱们犟不过他,只好模仿添加工程reference的情况下的文件结构,来绕过去这个问题。

此时该Packaging工程已同时包含UWPClient及DotNetConsoleApp.exe两部分内容。然而实现二者之间的调用,我们还需要编辑Packaging工程的Package.appxmanifest文件,选中该文件后右键点击Open with…然后再弹出的对话框中选择XML(Text)Editor。

在Package.appxmanifest文件的Application节点中添加如下内容:

  1. <Extensions>
  2. <desktop:Extension
  3. xmlns:desktop="http://schemas.microsoft.com/appx/manifest/desktop/windows10"
  4. Category="windows.fullTrustProcess"
  5. Executable="DotNetConsoleApp\DotNetConsoleApp.exe" />
  6. </Extensions>

至此,我们已基本完成了Appx with Desktop Extension的操作,几乎已经可以使用一个很流行的词叫“闭环”。但是等等,在点击F5运行之前,有个设置还需要改一下。在Solution文件上右键选中Properties,然后在Configuration中,将Packaging工程的Platform改成和UWPClient一致。UWPClient默认是x86,当然你都改成x64也可以。

有同学肯定要问为什么不能选AnyCPU,这是因为UWP使用了.NET Native预编译技术,是Platform相关的,详见:
.NET Native – What it means for Universal Windows Platform (UWP) developers
https://blogs.windows.com/buildingapps/2015/08/20/net-native-what-it-means-for-universal-windows-platform-uwp-developers/#mhT71xdPsoIclvV0.97
With .NET Native brought into the mix, AnyCPU is no longer a valid build configuration because native compilation is architecture dependent.
最后在我们运行AppxWithDesktopExtension程序之前,先看一眼DotNetConsoleApp工程到底做了什么。

  1. namespace DotNetConsoleApp
  2. {
  3. class Program
  4. {
  5. static void Main(string[] args)
  6. {
  7. Console.WriteLine("Suppose I'm an installer.");
  8. Console.ReadLine();
  9. }
  10. }
  11. }

是的,我们啥也没做,就是打印一行字假装我们是installer。实际在Appx我们也并没有引用该工程,而仅是包含了事先build好的DotNetConsoleApp.exe文件。
点击F5运行AppWithDesktopExtension工程,结果如下图所示。

本篇内容至此结束,附上GitHub地址:
https://github.com/manupstairs/AppxWithDesktopExtension
MS Store:
https://www.microsoft.com/store/productid/9N22D8RLKZN2

迁移桌面程序到MS Store(9)——APPX With Desktop Extension的更多相关文章

  1. 迁移桌面程序到MS Store(2)——Desktop App Converter

    迁移传统桌面程序到MS Store的另一种方式是使用Desktop App Converter工具.虽然本篇标题包含了Desktop App Converter(以下简称DAC),实际上我是来劝你别用 ...

  2. 迁移桌面程序到MS Store(8)——通过APPX下载Win32Component

    在上一篇<迁移桌面程序到MS Store(7)——APPX + Service>中,我们提到将desktop application拆分成UI Client+Service两部分.其中UI ...

  3. 迁移桌面程序到MS Store(14)——APPX嵌入WCF Service以Admin权限运行

    Windows10 1809版本开始,微软又对UWP开放了新的Capability:AllowElevation. 通过这个新的Capability,UWP APP能够在运行时向用户请求Admin权限 ...

  4. 迁移桌面程序到MS Store(5)——.NET Standard

    接下来的几篇,我想讨论下迁移桌面程序到MS Store,可以采用的比较常见.通用性比较强的实施步骤和分层架构. 通常商业项目一般都是不断的迭代,不太可能突然停止更新现有的桌面版本,然后花很长时间从头来 ...

  5. 迁移桌面程序到MS Store(1)——通过Visual Studio创建Packaging工程

    之前跑去做了一年多的iOS开发,被XCode恶心得不行.做人呢,最重要的是开心.所以我就炒了公司鱿鱼,挪了个窝回头去做Windows开发了.        UWP什么的很久没有正儿八经写了,国内的需求 ...

  6. 迁移桌面程序到MS Store(10)——在Windows S Mode运行

    首先简单介绍Windows 10 S Mode,Windows在该模式下,只能跑MS Store里的软件,不能通过其他方式安装.好处是安全有保障,杜绝一切国产流氓软件.就像iOS一样,APP进商店都需 ...

  7. 迁移桌面程序到MS Store(12)——WPF使用UWP InkToolbar和InkCanvas

    我们在<迁移桌面程序到MS Store(4)——桌面程序调用Win10 API>提到了对Win10 API的调用,但仍存在无法在WPF中使用UWP控件的问题,虽然都是XAML控件,但却是两 ...

  8. 迁移桌面程序到MS Store(13)——动态检查Win10 API是否可用

    假设我们现有一个WPF程序,需要支持1903以前的Windows 10版本.同时在1903以后的版本上,额外多出一个Ink的功能.那么我们就可以通过ApiInformation.IsApiContra ...

  9. 迁移桌面程序到MS Store(3)——开机自启动

    迁移桌面程序的时候,有可能你会遇到这么个需求——开机自启动.Windows传统桌面程序的传统陋习.不论什么奇葩软件都想要开机自启动,默认就给你打开,一开机哐哐哐什么雷,什么企鹅都蹦出来,也不管你用不用 ...

随机推荐

  1. Java--Vector类

    Java Vector 类 Vector类实现了一个动态数组.和ArrayList和相似,但是两者是不同的: Vector是同步访问的. Vector包含了许多传统的方法,这些方法不属于集合框架. V ...

  2. Emoji:搜索将与您找到表情符号背后的故事

    眼下.秉已经开始支持emoji搜索,这意味着,你可以插入或粘贴系列emoji表情,让我们的爱.微笑.食品等..些表情随意组合,必应总会带给你非常多有趣的但却没有不论什么实际用途的搜索结果. 这是一项非 ...

  3. 组态DNS、搜索域名和主机名

    一个.组态DNS和搜索领域 特别配置DNS该文件是/etc/resolv.conf:同时,我们可以ifcfg-eth0网卡的配置和其他配置文件中指定的. 演示样本: [root@instructor ...

  4. 从 RNN 到 LSTM (Short-Term Memory)

    理论上循环神经网络可以支持任意长度的序列,然而在实际中,如果序列过长会导致优化时出现梯度消散(the vanishing gradient problem)的问题,在实际中一把会规定一个最大长度,当序 ...

  5. EasyUI基础Draggable(拖)

    学前easyui基于解析器,装载机.对他们来说,入门阶段,我们只需要在这一个简单的了解,第一阶段,不宜过深后,. 接着,根据easyui排列官方网站为了学习文件Draggable小工具. Dragga ...

  6. Angular使用echarts

    安装 npm install echarts --save npm install @types/echarts --save 基本使用 定义一个dom <div id="chart& ...

  7. JSONObject 解析

    前解析json已使用get方法,但是,假设抛出将解决很烦人中断. 今天发现JSONObject还提供了一个更好用的方法opt.看来以后文档还是要更加认真的读的.以下是文档中的原文. A JSONObj ...

  8. 关于 Swift 中的 Array.contains 方法

    Swift 2.0 中对语言进行了又一次的改进,这次将整个语言变得更加面向对象化,比如在 Swift 1.x 中如果要判断某个元素是否在数组中,就需要用到 contains 函数: if contai ...

  9. C#调用Resources.resx资源文件中的资源

    使用到了.NET中的资源文件,也就是Resources.resx,于是就学会了如何调用资源文件中的资源.首先,资源文件可以从项目属性中的资源标签添加.比如,我添加一个图片,叫做aaa.png,添加入资 ...

  10. WPF MvvmLight简单实例(1) 页面导航

    原文:WPF MvvmLight简单实例(1) 页面导航 实现了那些功能,先看看截图: 操作描述: 在程序运行后,点击“Load”按钮,页面会加载PageOne,点击PageOne页面中的“Next” ...