继上次”vNext之旅(1):从概念和基础开始”之后再次学习vNext重新遇到了弄不懂的事情,花了一些时间学习,今天来分享一下,为后人节省些时间。
起因
在用vNext造轮子——框架的时候引入“Microsoft.Dnx.Runtime”包错误。错误如下:
当时就很郁闷我明明用的是最新的版本:“1.0.0-rc-final”啊,为什么会报错,微软改名之后没有及时更新包吗?
下面我打开了这个包在NuGet的地址。
发现确实只写了“DNX4.5.1”和“DNXCore50”这两个版本,我同时又打开了“Microsoft.Extensions.DependencyInjection”包的NuGet地址。
发现了“.NETFramework 4.5.1”、“.NETPlatform 5.4”、”.NETCore5.0”。
这时我很好奇,这两个包同是vNext的产物,没有原因支持的平台不一样啊,抱着这个问题我觉得创建个ConsoleApp测试一下。
打开“project.json”发现了和类库不一样的地方
这边的frameworks的命名完全不一样,
在类库中为:“net451”、“dotnet5.4”而在这里变成了“dnx451”、“dnxcore50”。
困惑又加重了,难道微软改名之后忘记改了ConsoleApp的模板?
解惑
我试着把这几个关键词输入google,找了了一些文章,终于解决了我的迷惑。
文章地址为:
https://github.com/aspnet/Announcements/issues/98
https://github.com/dotnet/corefx/blob/master/Documentation/project-docs/standard-platform.md
从这段话中说明了为什么“ConsoleApp”和“类库”项目框架目标不一致是正常的。。。
也给出了“ConsoleApp”、“测试项目”还是需要使用“dnx”和“dnxcore”这样的命名,而类库则需要使用“net”和“dotnet”这样的命名。
也给出了迁移方案,同时也给出了编码过程中的环境变量:
1.DNX451 => NET451
2.DNXCORE50 => DONET5_4
同时也发现,微软觉得应用程序和测试项目该采用“dnx”和“dnxcore”命名方式的框架目标。
至此疑惑解开,但还是觉得奇怪,微软为什么要这样区分,当时在.NET Framework上不就没有分这么多吗?
深究
为什么微软需要这么做?
抱着这样的疑问打开第二个链接,发现了这一段很好的解释了“为什么”。
这么做只有一个目标:可移植性。
在之前我们再用NuGet GUI工具打包的时候会发现有很多选择(下图)
而这些平台绝大数都拥有CLR,唯一变的只是应用程序端,只有这个端不一样,那么我开发一个汇率计算算法需要每个平台单独写吗?其实不需要,因为我们都运行于CLR,我们有CTS、CLS还有CLR这些东西你们去做兼容就好了,不需要开发者在纠结了,所以现在的微软一直强调“一个平台战略”、“一次编译到处运行”,只把会变化的应用程序端设置框架版本,而类库等通用的东西尽量变成全部可移植的。
下图来自微软:
右边的就属于类库,而左边的被微软定位为应用程序端的目标运行时。微软希望现代化的类库可以同时运行在这些端的运行时上,当然这个动作需要端的运行时配合与支持(微软给出的CLR的标准、语言规范等)。
下图是对应关系:
交流方式
QQ群:384413261(RabbitHub)
Email:majian159@live.com