迁移桌面程序到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的其他平台捞食)。当然你要指望学了就能在一线城市买两套房走上人生巅峰什么的,还不如锻炼身体去白马会所面试看看……