vNext之旅(2):net451、dotnet5.4、dnx451、dnxcore50都是什么鬼
继上次”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
vNext之旅(2):net451、dotnet5.4、dnx451、dnxcore50都是什么鬼的更多相关文章
- vNext之旅(1):从概念和基础开始
ASP.NET vNext or .NET vNext? vNext在曝光以来绝大多数以ASP.NET vNext这样的的字眼出现,为什么这边会提及.NET vNext?原因是我认为ASP.NET只是 ...
- ASP.NET 5 Target framework dnx451 and dnxcore50
中文不知如何定义标题,所以干脆就直接贴出关键字,在 ASP.NET 5 项目的 project.json 配置文件中,会有这样的定义: "frameworks": { " ...
- ASP.NTE 5 Target framework dnx451 and dnxcore50(转)原文:http://www.cnblogs.com/xishuai/p/aspnet5-target-framework-dnx451-and-dnxcore50.html
中文不知如何定义标题,所以干脆就直接贴出关键字,在 ASP.NTE 5 项目的 project.json 配置文件中,会有这样的定义: "frameworks": { " ...
- React Native填坑之旅--布局篇
代码在这里: https://github.com/future-challenger/petshop/tree/master/client/petshop/src/controller 回头看看RN ...
- ASP.NET vNext or .NET vNext?
ASP.NET vNext or .NET vNext? 从概念和基础开始 vNext在曝光以来绝大多数以ASP.NET vNext这样的的字眼出现,为什么这边会提及.NET vNext?原因是我认为 ...
- Asp.net vNext 学习1
Asp.net vNext 学习之路(一) 概述 asp.net vNext 也叫 asp.net 5.0,意思是微软推出的下一个版本的asp.net.可以说是微软对asp.net的一个比较重大的重新 ...
- [Abp vNext 源码分析] - 2. 模块系统的变化
一.简要说明 本篇文章主要分析 Abp vNext 当中的模块系统,从类型构造层面上来看,Abp vNext 当中不再只是单纯的通过 AbpModuleManager 来管理其他的模块,它现在则是 I ...
- Asp.net vNext 学习之路(一)
概述 asp.net vNext 也叫 asp.net 5.0,意思是微软推出的下一个版本的asp.net.可以说是微软对asp.net的一个比较重大的重新设计, asp.net vNext是一 个比 ...
- [Abp vNext 源码分析] - 7. 权限与验证
一.简要说明 在上篇文章里面,我们在 ApplicationService 当中看到了权限检测代码,通过注入 IAuthorizationService 就可以实现权限检测.不过跳转到源码才发现,这个 ...
随机推荐
- Android开发重点难点1:RelativeLayout(相对布局)详解
前言 啦啦啦~博主又推出了一个新的系列啦~ 之前的Android开发系列主要以完成实验的过程为主,经常会综合许多知识来写,所以难免会有知识点的交杂,给人一种混乱的感觉. 所以博主推出“重点难点”系列, ...
- K近邻模型(k-NN)
原理 K最近邻(k-Nearest Neighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一.该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻 ...
- jQuery修改class属性和CSS样式
jQuery修改class属性和CSS样式 class属性修改 类属性即class属性,规定类名. 用类选择器规定样式的时候,需要为元素指定类名,即class属性的值. 注意每个HTML元素只有一个c ...
- 关于json序列化循环引用导致出错
以下是错误信息: Caused by: java.lang.IllegalStateException: circular reference error Offending field: meth ...
- 【转载】ReactiveX 的理念和特点
原作者地址:http://www.open-open.com/lib/view/open1440166491833.html ReactiveX是Reactive Extensions的缩写,一般简写 ...
- iOS程序破解——获取.ipa程序包
原文在此 首先肯定不是获取自己的ipa包. 为什么要获取ipa包呢?比如,在仿写一些程序时,避免不了获取它的图片素材等等,那么最快也是最有效的方式就是获取原程序的ipa包.更或者,你想要逆向分析某一款 ...
- iframe大小自适应
前几天,舍友去某互联网公司面前端研发工程师.回来后,他就跟我们聊了下面试官给他出的题.其中,有一道题是“如何实现iframe高度的自适应?”.好吧,我承认,我听到iframe这个词的第一反应就是:这个 ...
- JVM-漫游
Write once, Run Any where. Java Virtual Machine – JVM 的存在让 Java 开发变得简单,并且一次编写多处运行.其实,JVM 就是一个抽象的计算机, ...
- EF如何操作内存中的数据以及加载相关联表的数据:延迟加载、贪婪加载、显示加载
之前的EF Code First系列讲了那么多如何配置实体和数据库表的关系,显然配置只是辅助,使用EF操作数据库才是每天开发中都需要用的,这个系列讲讲如何使用EF操作数据库.老版本的EF主要是通过Ob ...
- MongoDB学习笔记~大叔分享批量添加—批量更新—批量删除
回到目录 说它是批量操作,就是说将集合对象一次提交到服务器,并对数据进行持久化,如果您的代码是一次一次的提交,那不算是批量操作!在之前的mongodb仓储中并没有对批量更新和批量删除进行实现,而今天在 ...