为了账号安全,请及时绑定邮箱和手机立即绑定

迁移桌面程序到MS Store(9)——APPX With Desktop Extension

2019.05.24 16:54 330浏览

在《迁移桌面程序到MS Store(8)——通过APPX下载Win32Component》中我们讨论了通过APPX来下载Service部分的安装包。但是纯UWP的客户端并不能自动运行下载的exe或者msi文件。本篇将着手解决这个问题。

假设我们有如下结构的application,蓝色APPX中包含UWP及.NET Standard Libraries。而Service部分以WCF的形式Host在Windows Service上,这其中包含了诸如Win32 API等无法迁移到UWP的内容。

https://img1.mukewang.com/5ce7af330001f3e805030381.jpg

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

https://img4.mukewang.com/5ce7af630001ac5c08420572.jpg

样例代码放在全球最大的同性交友平台GitHub:

https://github.com/manupstairs/AppxWithDesktopExtension

也可以去MS Store试下成品:

https://www.microsoft.com/store/productid/9N22D8RLKZN2

首先看AppWithDesktopExtension1文件夹,由三个工程组成。

https://img4.mukewang.com/5ce7af910001303c09200546.jpg

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

        private async void Button_Click(object sender, RoutedEventArgs e)
        {
            if (ApiInformation.IsApiContractPresent("Windows.ApplicationModel.FullTrustAppContract", 1, 0))
            {
                await FullTrustProcessLauncher.LaunchFullTrustProcessForCurrentAppAsync();
            }
        }

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

https://img2.mukewang.com/5ce7afcf000199c524871361.jpg

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的情况下的文件结构,来绕过去这个问题。

https://img4.mukewang.com/5ce7affb000147ae08880816.jpg

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

https://img2.mukewang.com/5ce7b01d000128de13640997.jpg

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

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

https://img1.mukewang.com/5ce7b04c0001dc0325760648.jpg

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

https://img4.mukewang.com/5ce7b0a20001f8dc21631493.jpg

有同学肯定要问为什么不能选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工程到底做了什么。

namespace DotNetConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Suppose I'm an installer.");
            Console.ReadLine();
        }
    }
}

是的,我们啥也没做,就是打印一行字假装我们是installer。实际在Appx我们也并没有引用该工程,而仅是包含了事先build好的DotNetConsoleApp.exe文件。

点击F5运行AppWithDesktopExtension工程,结果如下图所示。

https://img.mukewang.com/5ce7b0e90001a30a13120926.jpg

本篇内容至此结束,附上GitHub地址:

https://github.com/manupstairs/AppxWithDesktopExtension

MS Store:

https://www.microsoft.com/store/productid/9N22D8RLKZN2


点击查看更多内容

本文首次发布于慕课网 ,转载请注明出处,谢谢合作

0人点赞

若觉得本文不错,就分享一下吧!

评论

相关文章推荐

正在加载中
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消