上一篇我们简单介绍了.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的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. Robotframework与unittest对比

    都可以自动挂ui测试 都可以自动化接口测试

  2. 安装ADT和ADK到eclipse

    1.安装好JDK后,配置一下环境变量: 为了配置JDK的系统变量环境,我们需要设置三个系统变量,分别是JAVA_HOME,Path和CLASSPATH.下面是这三个变量的设置防范. JAVA_HOME ...

  3. HTML5基础实例

    <!DOCTYPE html> <!--声明HTML文档--> <html> <head> <title>我的网页</title> ...

  4. Python之异常处理和socket套接字连接7

    一.异常处理 1)异常处理的使用意义 什么是异常处理 异常是程序发生错误的信号,即程序一旦出错就会立刻产生一个异常,如果该异常没有被处理 那么异常就抛出来,程序的运行也随之终止 异常分为三部分: 异常 ...

  5. Java日期时间使用总结[转载]

    Java日期时间使用总结   一.Java中的日期概述   日期在Java中是一块非常复杂的内容,对于一个日期在不同的语言国别环境中,日期的国际化,日期和时间之间的转换,日期的加减运算,日期的展示格式 ...

  6. Bootstrap Table 超多列 使用滚动条

    overflow-x: scroll;横向滑动详细讲解 able显示滚动条,要先把table放到一个div中,控制div 属性overflow值为scroll <div style=" ...

  7. PHP时间范围:本周、本月、下月等简写

    在阅读TP5.1源码,发现其在时间范围上的写法很特别,个人第一次见,做一次记录 $timeRule = [ 'today' => ['today', 'tomorrow'], 'yesterda ...

  8. Edifact 95B报文解读

    PART 1 INTRODUCTION D100_D.95B PART 2 UNIFORM RULES OF CONDUCT FOR INTERCHANGE PART2_D.ZIP(1) OF TRA ...

  9. 【慕课网实战】Spark Streaming实时流处理项目实战笔记五之铭文升级版

    铭文一级: 单节点单broker的部署及使用 $KAFKA_HOME/config/server.propertiesbroker.id=0listenershost.namelog.dirszook ...

  10. 11-border(边框)

    边框 border:边框的意思,描述盒子的边框 边框有三个要素: 粗细 线性样式 颜色 border: solid 如果颜色不写,默认是黑色.如果粗细不写,不显示边框.如果只写线性样式,默认的有上下左 ...