迁移桌面程序到MS Store(6)——.NET Portability Analyzer
上一篇我们简单介绍了.NET Standard,本篇我们来实践.NET Framework 4.5 Class Library到.NET Standard 2.0的转换.
首先让我们来做一些准备工作。
第一步,需要将项目组所有同事的Visual Studio统一升级到2017 15.3版本或更新。(程序员鼓励师不用升级Visual Studio)
第二步,将要被转换的.NET 4.5的Class Library升级到.NET 4.7.2。这是因为如果存在早期版本的.NET API在.NET 4.7.2已经是过期的,或者被移除了。而我们找不到替代方案,那么就可以停下来喝杯水关掉电脑下班了。
第三步是我们今天着重介绍的.NET Portability Analyzer工具,可以通过分析代码或DLL来生成报表,报表会显示你的.NET Framework Class Library和.NET Standard Class Library的兼容性百分比。就我的实际使用经验来看,一般可以直接转换的代码都会在90%以上。除了一些已明确声明不在.NET Core中支持的功能。(因为.NET Core就是下一代.NET Framework,所以.NET Core中不支持的,自然.NET Standard也不需要费力去支持了)。
.NET Portability Analyzer作为Visual Studio2017的插件可以在这里下载:
https://marketplace.visualstudio.com/items?itemName=ConnieYau.NETPortabilityAnalyzer
安装之后,你就可以在Visual Studio2017的Analyze菜单中找到Analyze Assembly Portability项。点击后,你可以选择exe或者dll文件,来进行.NET Standard的兼容性分析。
但一般来说,我们是希望迁移自己的Class Library,所以我们是有源代码的,那么兼容性的检查就更简单了。只需要在Solution Explorer中右键点击要分析的Project,然后选择Analyze Assembly Portability即可。
我这里想用Newtonsoft.Json来举个例子,来说明这种通用性很强的Library迁移到.NET Standard 2.0可能存在的问题,及需要的工作量。
我们从Github上clone一份Newtonsoft.Json的源代码,通过.NET Portability Analyzer的分析,可以得到一份Excel表格,我们着重看.NET 4.5和.NET Standard 2.0两行,可以发现当前的代码100%兼容这两个.NET版本。
我们发现在.NET Standard 1.3版本存在一些不兼容。点击Excel表格的Details页,里面会列出具体的不兼容项,这里会发现原因是部分类型直到.NET Standard 1.6以上的版本才得到支持。同时如果存在不同的语法或者替代类可以使用,在最后一列的Recommended changes中会列出。
完成Analyze Assembly Portability后,我们就可以根据结果决定是否要进行迁移了。
本篇的主要内容到这里就结束了。接下来就上一篇提到的,展望一下.NET Core。
.NET Core可以理解就是未来版本的.NET Framework。主要的关键词有以下几个:
• 开源:都在 https://github.com/dotnet/corefx 上了,好奇某个类是如何实现的,可以肆无忌惮的查看源码了。
• 跨平台:支持Windows,macOS和Linux。
• 兼容性:通过.NET Standard来保持和.NET Framework, Xamarin和Mono的兼容。
当前最新版本是2.2,重心依然是ASP.NET Core(传统的ASP.NET Web Forms和ASP.NET MVC将不会在.NET Core得到支持)。虽然官方的说法是UWP也是built on top of .NET Core。但我暂时并没有领会到某软的意思。
可喜的是,在即将到来的.NET Core 3.0版本中,对desktop development有了更多的补充,传统的Winform和WPF会具有更好的性能,以及得到完整的Win10 API的支持。
.NET Core的基础类库中,90%的代码都是平台无关的。平台依赖的部分,某软举例CoreCLR,SystemIO和System.Security.Cryptography.Algorithms,这些都是依赖特定操作系统的实现。
平台无关的部分举例也很好理解,比如System.Collections和System.Linq啥的,依赖的是数据结构的定义,而不是操作系统。
所以对使用微软技术的开发者来说,.NET Core即是未来吃饭的家伙(还可以去非Windows的其他平台捞食)。当然你要指望学了就能在一线城市买两套房走上人生巅峰什么的,还不如锻炼身体去白马会所面试看看……
迁移桌面程序到MS Store(6)——.NET Portability Analyzer的更多相关文章
- 迁移桌面程序到MS Store(5)——.NET Standard
接下来的几篇,我想讨论下迁移桌面程序到MS Store,可以采用的比较常见.通用性比较强的实施步骤和分层架构. 通常商业项目一般都是不断的迭代,不太可能突然停止更新现有的桌面版本,然后花很长时间从头来 ...
- 迁移桌面程序到MS Store(1)——通过Visual Studio创建Packaging工程
之前跑去做了一年多的iOS开发,被XCode恶心得不行.做人呢,最重要的是开心.所以我就炒了公司鱿鱼,挪了个窝回头去做Windows开发了. UWP什么的很久没有正儿八经写了,国内的需求 ...
- 迁移桌面程序到MS Store(8)——通过APPX下载Win32Component
在上一篇<迁移桌面程序到MS Store(7)——APPX + Service>中,我们提到将desktop application拆分成UI Client+Service两部分.其中UI ...
- 迁移桌面程序到MS Store(9)——APPX With Desktop Extension
在<迁移桌面程序到MS Store(8)——通过APPX下载Win32Component>中我们讨论了通过APPX来下载Service部分的安装包.但是纯UWP的客户端并不能自动运行下载的 ...
- 迁移桌面程序到MS Store(10)——在Windows S Mode运行
首先简单介绍Windows 10 S Mode,Windows在该模式下,只能跑MS Store里的软件,不能通过其他方式安装.好处是安全有保障,杜绝一切国产流氓软件.就像iOS一样,APP进商店都需 ...
- 迁移桌面程序到MS Store(12)——WPF使用UWP InkToolbar和InkCanvas
我们在<迁移桌面程序到MS Store(4)——桌面程序调用Win10 API>提到了对Win10 API的调用,但仍存在无法在WPF中使用UWP控件的问题,虽然都是XAML控件,但却是两 ...
- 迁移桌面程序到MS Store(13)——动态检查Win10 API是否可用
假设我们现有一个WPF程序,需要支持1903以前的Windows 10版本.同时在1903以后的版本上,额外多出一个Ink的功能.那么我们就可以通过ApiInformation.IsApiContra ...
- 迁移桌面程序到MS Store(14)——APPX嵌入WCF Service以Admin权限运行
Windows10 1809版本开始,微软又对UWP开放了新的Capability:AllowElevation. 通过这个新的Capability,UWP APP能够在运行时向用户请求Admin权限 ...
- 迁移桌面程序到MS Store(2)——Desktop App Converter
迁移传统桌面程序到MS Store的另一种方式是使用Desktop App Converter工具.虽然本篇标题包含了Desktop App Converter(以下简称DAC),实际上我是来劝你别用 ...
- 迁移桌面程序到MS Store(3)——开机自启动
迁移桌面程序的时候,有可能你会遇到这么个需求——开机自启动.Windows传统桌面程序的传统陋习.不论什么奇葩软件都想要开机自启动,默认就给你打开,一开机哐哐哐什么雷,什么企鹅都蹦出来,也不管你用不用 ...
随机推荐
- vue入门:axios的应用及拦截封装
一.概述 在vue2.0项目中,我们主要使用axios进行http请求. axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中. 特征: 1.从浏览器中创建X ...
- 事务ACID如何定义,事务隔离性解决的问题
挚享科技 2018.4.8 事务的四个特性: 1. 原子性: 同一个事务的多个操作,要么都成功,要么全部失败回滚. 2. 一致性: 事务必须确保数据库从一个一致性状态变换为另一个一致性状态. 其实就是 ...
- Linux学习笔记:JDK安装
系统为CentOS 7,安装Oracle jdk1.8 卸载系统自带的Openjdk(若无可跳过这一步,可以通过 java -version 查看),步骤是:查找Openjdk,卸载Openjdk r ...
- shell for if
#!/bin/bash ..} do ];then j="${i}" else j="${i}" fi echo $j >> venn.log ec ...
- ODT(old driver tree)详解(带例题)
文章目录 ODT简介 实现前提&&实现原理 初始化 split操作 assign操作 其它操作 区间第k小 区间加 区间所有数的k次方和 几道水题 ODT简介 ODT(old driv ...
- VC播放mp3的方法
1.使用msi库 #include <mmsystem.h> #pragma comment(lib,"winmm.lib") ....... //打开文件 MCI_O ...
- 安装了nodejs后在命令行运行npm报错:Error: Cannot find module 'internal/util/types'
报错如下图所示: 解决方法:删除目录“C:\Users\wls\AppData\Roaming\npm\node_modules”下的npm文件夹
- 实现1sym转换成2个sym送给CVI(VGA数据)
CVI的时序如下 :de指示数据有效. 从下面的程序看,同步码的长度不会影响对有效数据的判断.同步码的作用更多的是用于计算行及一行的像素数目.方案一: 1 module vga_1sym_2_2sym ...
- Ubuntu下配置PHP和CakePHP记录
目前在完成一个PayPal的支付页面,需要有PHP的开发环境,同时,在开发时使用了CakePHP的框架,于是就有了下面的情景. 操作环境: OS:ubuntu-14.04.2-desktop-amd6 ...
- HTML中JavaScript调用方法
我在写web页面的时候,经常用js实现某些功能,我用的方法有两种: 1.点击调用JavaScript: <button onclick="loadXMLDoc()">b ...