继上次”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都是什么鬼的更多相关文章

  1. vNext之旅(1):从概念和基础开始

    ASP.NET vNext or .NET vNext? vNext在曝光以来绝大多数以ASP.NET vNext这样的的字眼出现,为什么这边会提及.NET vNext?原因是我认为ASP.NET只是 ...

  2. ASP.NET 5 Target framework dnx451 and dnxcore50

    中文不知如何定义标题,所以干脆就直接贴出关键字,在 ASP.NET 5 项目的 project.json 配置文件中,会有这样的定义: "frameworks": { " ...

  3. 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": { " ...

  4. React Native填坑之旅--布局篇

    代码在这里: https://github.com/future-challenger/petshop/tree/master/client/petshop/src/controller 回头看看RN ...

  5. ASP.NET vNext or .NET vNext?

    ASP.NET vNext or .NET vNext? 从概念和基础开始 vNext在曝光以来绝大多数以ASP.NET vNext这样的的字眼出现,为什么这边会提及.NET vNext?原因是我认为 ...

  6. Asp.net vNext 学习1

    Asp.net vNext 学习之路(一) 概述 asp.net vNext 也叫 asp.net 5.0,意思是微软推出的下一个版本的asp.net.可以说是微软对asp.net的一个比较重大的重新 ...

  7. [Abp vNext 源码分析] - 2. 模块系统的变化

    一.简要说明 本篇文章主要分析 Abp vNext 当中的模块系统,从类型构造层面上来看,Abp vNext 当中不再只是单纯的通过 AbpModuleManager 来管理其他的模块,它现在则是 I ...

  8. Asp.net vNext 学习之路(一)

    概述 asp.net vNext 也叫 asp.net 5.0,意思是微软推出的下一个版本的asp.net.可以说是微软对asp.net的一个比较重大的重新设计, asp.net vNext是一 个比 ...

  9. [Abp vNext 源码分析] - 7. 权限与验证

    一.简要说明 在上篇文章里面,我们在 ApplicationService 当中看到了权限检测代码,通过注入 IAuthorizationService 就可以实现权限检测.不过跳转到源码才发现,这个 ...

随机推荐

  1. Oracle常用SQL查询(2)

    三.查看数据库的SQL 1 .查看表空间的名称及大小 select  t.tablespace_name,  round ( sum (bytes / ( 1024 * 1024 )), 0 ) ts ...

  2. Android Gson的使用总结

    1.概念 Gson是谷歌发布的一个json解析框架 2.如何获取 github:https://github.com/google/gson android studio使用 compile 'com ...

  3. xcode8打包ipa文件, application loader上传成功,但是iTunes Connect不显示构建版本

    最近更新的Xcode8.今天提交新项目时.按照以往的流程走 Xcode 编译ipa文件.applicaiton loader提交成功 但是.iTunes connect构建版本不显示.非常疑惑.平时等 ...

  4. android SharedPreferences介绍

    SharedPreferences是Android平台上一个轻量级的存储类,主要是保存一些常用的配置比如窗口状态,一般在Activity中重载窗口状态onSaveInstanceState保存一般使用 ...

  5. CoreData

    之前在学习使用SQLite时, 需要编写大量的sql语句,完成数据的增删改查,但对于不熟悉sql语句的开发人员来说,难度较大,调试程序比较困难. 由此出现CoreData框架,将sql的操作转换成为对 ...

  6. javascript 常见方法记录

    1,trim():去除字符串左右两端的空格,在vbscript里面可以轻松地使用 trim.ltrim 或 rtrim,但在js中却没有这3个内置方法,需要手工编写. <script langu ...

  7. MVC学习系列3--怎么从控制器向视图传递数据

    在MVC中,从控制器到视图,传递数据,可以使用 ViewData 和 ViewBag:同样从视图到控制器,传递数据,可以使用Post,QueryString,或者隐藏域:最后从控制器到控制器,传递数据 ...

  8. 实时事件统计项目:优化flume:用file channel代替mem channel

    背景:利用kafka+flume+morphline+solr做实时统计. solr从12月23号开始一直没有数据.查看日志发现,因为有一个同事加了一条格式错误的埋点数据,导致大量error. 据推断 ...

  9. form表单取消按钮自动提交

    默认写在form表单里的按钮可以自动提交表单,现在要实现的效果是点击button按钮调用js函数,再有ajax提交 <button type="button" class=& ...

  10. android 拔打电话功能

    private void phoneCall(String num) { String phoneNum = "tel:" + num; Uri smsToUri = Uri.pa ...