接下来的几篇,我想讨论下迁移桌面程序到MS Store,可以采用的比较常见、通用性比较强的实施步骤和分层架构。
  通常商业项目一般都是不断的迭代,不太可能突然停止更新现有的桌面版本,然后花很长时间从头来写UWP版本,所以我建议将迁移的过程分阶段,通过几个版本的迭代,慢慢地从传统桌面程序,转变成一个可以通过MS Store审核的APPX程序。至于之后要不要变成真·UWP可以视市场反馈决定。
  假设现有的桌面程序包含一个MainUI的WPF工程,多个.NET Framework 4.5的类库,以及一个C++编写的后台服务,以Windows Service的形式运行。之所以假设存在一个C++的Service,是考虑有些桌面程序要和硬件打交道,只有C语言版本的API。或者需要调用公司自己的通用类库,通常是C或C++写的跨平台版本。
  我推荐第一步,也是最简单的一步从.NET Framework类库着手改起。第一阶段的目标是将.NET Frramwork 4.5的类库,转换成.NET Standard 2.0版本的类库。

  

  这里要着重介绍一下.NET Standard。MSDN上对于.NET Standard的解释虽然每个字都认识,可把这些字连成句子,读起来就不太容易看懂。
  https://docs.microsoft.com/zh-cn/dotnet/standard/net-standard
  总而言之呢,就是一个Class Library(.NET Standard),它既可以被WPF工程引用,也可以被UWP工程引用,同时还可以被.NET Core的工程引用。
  在我们的例子中,因为我们的MainUI仍然是WPF的工程,所以不能直接将.NET Framework 4.5的Class Library转换成Universal Windows版本。同时我们又需要对未来可能存在的UWP版本提供支持,那么.NET Standard就是最佳的选择。
  在这种情况下,我们甚至可以在保留WPF的MainUI以支持Win 7(该死的老古董)的同时,新建一个UWP的UI工程来支持Win10。二者共用同一份的.NET Standard的Class Library。
  可能有些同学会问,同样一个C#的Class Library,为什么会有.NET Framework,Universal Windows,.NET Core和.NET Standard四种类型。下面我们来简单介绍以上几个概念,这些拗口的名称得感谢某软改名部八辈子祖宗,顺便问下还招人不?
  .NET Framework最为好懂,从2000年左右的.NET 1.0开始,现今已经发展到.NET 4.7.2。你说4.5以后怎么光升小版本号啊?啥时候出.NET 5啊?我说孩子你别傻了,.NET 5不就是.NET Core嘛?
  .NET Core,个人理解就是为了跨平台,重写的.NET Framework,也同样是为了跨平台,所以现阶段主打ASP.NET Core,而和Windows紧密结合的WPF,Winform,甚至UWP都是暂不支持的。毕竟在短时间内,重新写一份包含.NET 4.7.2所有功能的.NET Core不太现实。也没有迫切的需要。从GitHub的roadmap看,至少要到3.0版本才会支持UWP及桌面开发。
  https://blogs.msdn.microsoft.com/dotnet/2018/05/07/net-core-3-and-support-for-windows-desktop-applications

  

  Universal Windows class library就比较尴尬了,作为Win8那时候的Windows Runtime portable class library的Win10升级版。技术是好技术,可惜没赶上好时候。Win8和WP8的口碑不行,连累了Win10。简而言之就是给所有UWP程序用的class library。
  .NET Standard则是Universal Windows Class Library的跨平台再升级版。最终的大一统,今日的主角。

  

  上面这个表格看上去内容很多,实际我们仅仅需要看最后一列,使用最新的.NET Standard 2.0就可以了。抛去和我们迁移桌面程序关系不大的Mono,Xamarion和Unity,实际我们可以看到从.NET 4.6.1开始就已经支持.NET Standard 2.0了。从Windows 10版本来看的话,RS3的16299也已经是非常普及的版本了。
  升级到.NET Standard的好处非常明显,.NET Standard版本的类库可以在.NET Framework,UWP和.NET Core 之间共享,同时面向未来的升级做到无缝衔接。
  本着先易后难,循序渐进的原则,这一篇我们先讨论了什么是.NET Standard,以及升级的目的和意义。下一篇我们会介绍在升级.NET Framework到.NET Standard的过程中,可以使用的兼容性检测工具The .NET Portability Analyzer。顺便在展望一下.NET Core 3.0,一边写代码一边吹吹水,体验双倍的快乐!

迁移桌面程序到MS Store(5)——.NET Standard的更多相关文章

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

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

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

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

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

    在<迁移桌面程序到MS Store(8)——通过APPX下载Win32Component>中我们讨论了通过APPX来下载Service部分的安装包.但是纯UWP的客户端并不能自动运行下载的 ...

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. Spring MVC 之 请求url 带后缀的情况

    RequestMappingInfoHandlerMapping 在处理http请求的时候, 如果 请求url 有后缀,如果找不到精确匹配的那个@RequestMapping方法.那么,就把后缀去掉, ...

  2. ios黑科技

    1.brew brew 是 Mac 下的一个包管理工具,类似于 centos 下的 yum,可以很方便地进行安装/卸载/更新各种软件包,例如:nodejs, mysql等,可以用来快速搭建各种本地环境 ...

  3. 剑指offer例题——链表中倒数第K个结点

    题目描述 输入一个链表,输出该链表中倒数第k个结点. 编程过程 此处采用两个指针依次后移的方法来求解,首先,用一个指针移到第k个位置,之后将第二个指针放在第一位,与第二个指针一同移动,当第二个指针移动 ...

  4. 学JS的心路历程 - JS应用

    各家电商网站都推出了各种活动和现今优惠券,当时在逛PTT时看到了有篇文章,提供代码教大家用JS的方式抢票,看了一下后发现好像很多人好奇这是怎么做的,于是就想说想一篇文章来讲解一下. 我们先来看一下折价 ...

  5. DB2在dbvisualizer 客户端执行begi/end 语句块

    注意,begin end 代码块在dbvisualizer 执行前要加 --/   后面要加   / 注意,begin end 代码块在dbvisualizer 执行前要加 --/   后面要加    ...

  6. day43 多表查询和pymysql

    复习 增删改查全语法 # 增 insert into db1.t1(字段2, 字段1, ..., 字段n)|省略 values (值2, 值1, ..., 值n)|(值1, 值2, ..., 值n)[ ...

  7. 针对piix4_smbus ****host smbus controller not enabled的解决方法

    SMBus 目录 SMBus与I2C的差别 SMBus 是 System Management Bus 的缩写,是1995年由Intel提出的,应用于移动PC和桌面PC系统中的低速率通讯.它主要是希望 ...

  8. Codeforces Round #510 (Div. 2)

    Codeforces Round #510 (Div. 2) https://codeforces.com/contest/1042 A 二分 #include<iostream> usi ...

  9. [leetcode]38. Count and Say数数

    The count-and-say sequence is the sequence of integers with the first five terms as following: 1. 1 ...

  10. 安装Ubuntu 18.04后的一些操作

    安装Ubuntu 18.04后的一些操作 1.设置root密码 sudo passwd 2.登陆root(输入密码后看到井号就是切换成为root账户) su 3.删除预装 apt-get remove ...