ASP.NET 5 Target framework dnx451 and dnxcore50
中文不知如何定义标题,所以干脆就直接贴出关键字,在 ASP.NET 5 项目的 project.json 配置文件中,会有这样的定义:
"frameworks": {
"dnx451": { },
"dnxcore50": { }
}
frameworks 配置的是什么东西?dnx451 和 dnxcore50 又是什么鬼?
可能了解过 ASP.NET 5 的童鞋会知道,但如果再深入一些,就必须搞清楚 ASP.NET 5 相关内容的来龙去脉,幸好几个月之前,我写过几篇类似的博文,不过现在已经忘的差不多了,而且 ASP.NET 5 的变化也非常大,现在又重读了之前写的博文,然后又 Google 了一下资料,回忆的差不多了,再记录一遍。
之前的相关博文:
- 魅力 .NET:从 Mono、.NET Core 说起
- .NET Core 和 .NET Framework 之间的关系
- Microsoft Build 2015 汇总
- K & DN 的前世今生(微软开源命名变革)
首先,再明确下 .NET Core 和 .NET Framework 之间的关系?我们之前开发 ASP.NET 应用程序,微软更新它,然后我们应用程序跟着更新,1.0->2.0->3.0->4.0->4.5->…,应用程序还是照样跑,所以我们一般不太关心 .NET Framework 到底是什么鬼?但现在微软搞了 ASP.NET 5,开发方式和之前有很大的不同,比如上面的配置代码,你就需要搞清楚到底是什么东西?.NET Core 和 .NET Framework 的关系,之前的博文中我说过是子集关系,其实现在看来也不是完全正确,.NET Core 应该是全新的一个 .NET Framework 实现,关系的话,应该是平级。
.NET Core 包含:
- 运行时库:.NET Core Runtime(coreclr、dnx)
- 基础类库:.NET Core Framework(corefx)
我们一般说的 .NET Framework 是基础类库,也就是项目中引用的程序集,其实这并不准确,它应该还包含运行时库,.NET Framework 是一个大的概念,微软更新 .NET Framework 4.5.1,其实并不只是更新基础类库,还有运行时的一些东西,比如编译器等等,不过我们开发者直接感受到的是基础类库的变化,所以概念中的理解会有些偏差。
下面两张图可以更好的理解。


从第一张图中可以看到,.NET Framework 4.6 包含了一大堆东西(重要的是最后一条),倒第二条中说 ASP.NET 5 可以运行在 .NET Framework 4.6 上,这是什么意思呢?ASP.NET 5 可以运行在 .NET Core 上,又可以运行在 Framework 4.6 上,也就是 project.json 配置文件中的 frameworks 配置,ASP.NET 5 和 .NET Core 并不是一一对应,脱离了 .NET Core,ASP.NET 5 照样可以运行,只不过和一般 ASP.NET 应用程序没什么区别,比如不能跨平台,但如果反过来就不行了,比如基于 .NET Framework 4.6 的一般 ASP.NET 应用程序就不能运行在 .NET Core 上,为什么?因为之前的 ASP.NET 都是基于 .NET Framework 设计的,并没有兼容 .NET Core。
第二张图很好的说明了 .NET Core 和 .NET Framework 之前的关系,注意 .NET Framework 4.6 下面注释中的 for windows 字眼,后面有这样一个词 Desktop CLR,其实说的就是 .NET Framework CLR,或者称之为 Windows .NET CLR,.NET Core 5 图中包含 CoreCLR 和 .NET Native,其实 .NET Native 也是 CoreCLR 的一种,称之为代码即时编译(不经过中间语言,直接将程序代码编程成机器语言),注释中的 .NET libraries 和 runtimes,其实就是我们上面所说 .NET Core 的两点内容。
再来说下运行时库是什么鬼?ASP.NET 5 的运行时就是 DNX
The DNX (a .NET Execution Environment) contains the code required to bootstrap and run an application, including the compilation system, SDK tools, and the native CLR hosts.
DNX 主要包含编译器、SDK 工具、即时编译运行时(上面说到的 .NET Native),运行 ASP.NET 5 应用程序命令 dnx kestrel,其实就是 SDK tools 的一种,它的作用就是将 ASP.NET 5 应用程序运行在 DNX 上,有点像 IIS 站点中的启动/停止。
好了,了解了这么多。我们再来看 project.json 中的 frameworks 配置,它的作用就是配置 ASP.NET 5 应用程序运行在哪个环境中?这里说的环境并不只包含运行时,还有基于的基础类库。
看一下 frameworks 配置选项:
dnxcore50DNX SDK running on CoreCLR/CoreFxdnx451DNX SDK running on .Net 4.5.1 (Desktop CLR / Full BCL and FCL)net46.Net Framework SDK running on .Net 4.6 (Desktop CLR / Full BCL and FCL).uap10.0UWP SDK running on .Net Native/CoreFxdotnetany pure IL code which declares its dependencies (instead of a PCL contract). Framework dependencies are available for .Net 4.6, DNX or UWP.
因为我们是 ASP.NET 开发,所以常用的是 dnx451 和 dnxcore50,简单总结:
dnx*The Dotnet Runtime Environment for the .NET Frameworkdnxcore*The Dotnet Runtime Environment for the .NET Core CLR
* 代表版本号,微软以后可能会进行更新升级,结合之前的说明,再看上面的定义,其实就非常好理解了,说白了,dnx* 只适用于 windows,dnxcore* 适用于跨平台,就这么简单。
一张非常详细的图:

另外,frameworks 还有另外一种作用,就是对运行的每一种环境进行单独配置,我们最常配置的,dnx451 和 dnxcore50 两种环境都引用同一个程序集,配置代码:
"dependencies": {
"library1": "1.0.0"
},
"frameworks": {
"dnx451": { },
"dnxcore50": { }
}
如果 dnx451 引用 library1,dnxcore50 不引用,那改如何配置呢?配置代码:
"dependencies": {
},
"frameworks": {
"dnx451": {
"dependencies": {
"library1": "1.0.0"
}
},
"dnxcore50": { }
}
如果 dnx451 和 dnxcore50 都引用 library1,但是 library1 需要编写不同的代码,该如何操作?答案如下:
#if DNX451
//Code here for dnx451
#elif DNXCORE50
//code here for dnxcore50
#endif
需要注意的是,dnx451 和 dnxcore50 都可以引用 ASP.NET 5 类库项目,但对于非 ASP.NET 5 类库项目,dnx451 可以引用(有警告),dnxcore50 则不可以引用。
参考资料:
- Project.json file
- Introducing .NET Core
- Announcing NuGet 3.1 with Support for Universal Windows Platform
- Demystifying PCL’s, .NET Core, DNX and UWP
- What frameworks are available in ASP.NET 5 applications?
- Target framework dnx451 or net451 in class library projects
- Project.json definition dnx451 vs .dotnet ( 4.51)
ASP.NET 5 Target framework dnx451 and dnxcore50的更多相关文章
- 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": { " ...
- 什么是目标框架别名(What are the Target Framework Monikers (TFMs))?
我们现在的.NET Core 1.0应用(ASP.NET Core 1.0应用或控制台应用)有了新的被运行在不同框架上的可能性:①运行在.NET Core平台上 ②运行在传统的.NET Framewo ...
- vNext之旅(2):net451、dotnet5.4、dnx451、dnxcore50都是什么鬼
继上次"vNext之旅(1):从概念和基础开始"之后再次学习vNext重新遇到了弄不懂的事情,花了一些时间学习,今天来分享一下,为后人节省些时间. 起因 在用vNext造轮子--框 ...
- ABP 教程文档 1-1 手把手引进门之 ASP.NET Core & Entity Framework Core(官方教程翻译版 版本3.2.5)
本文是ABP官方文档翻译版,翻译基于 3.2.5 版本 官方文档分四部分 一. 教程文档 二.ABP 框架 三.zero 模块 四.其他(中文翻译资源) 本篇是第一部分的第一篇. 第一部分分三篇 1- ...
- ASP.NET MVC - Entity Framework
ASP.NET MVC - Entity Framework 实体关系 关系是某个实体(表)的一条记录对应于另一个实体(表)的一条或多条记录. 一对多关系 单方面的包含关系称为一对多,而一对多和一对一 ...
- Vs2013 坑爹的Target framework问题
之前的一个项目是使用Vs2008来开发的,因为这段时间家里有事情所以只能跟经理协商在家里来做此项目,因为家里的VS是2013的所以在迁移时没有什么问题 但今天我更改一个类库的文件后重新生成解决方案结果 ...
- 使用ASP.NET MVC+Entity Framework快速搭建系统
详细资料: http://www.cnblogs.com/dingfangbo/p/5771741.html 学习 ASP.NET MVC 也有一段时间了,打算弄个小程序练练手,做为学习过程中的记录和 ...
- ASP.NET Identity + Entity Framework 6 注意
最近一个项目使用ASP.NET Identity + Entity Framework 6开发,本来一切正常. 某时注意到,更改密码功能程序执行起来没有问题,界面上也报修改密码成功,但实际上密码并没有 ...
- [转]MSBuild Target Framework and Target Platform
本文转自;https://msdn.microsoft.com/en-us/library/hh264221.aspx A project can be built to run on a targe ...
随机推荐
- C++内存对齐总结
大家都知道,C++空类的内存大小为1字节,为了保证其对象拥有彼此独立的内存地址.非空类的大小与类中非静态成员变量和虚函数表的多少有关. 而值得注意的是,类中非静态成员变量的大小与编译器内存对齐的设置有 ...
- Js new到底发生了什么
在Js中,我们使用了new关键字来进行实例化 那么在这个new的过程中到底发生了什么? 关于构造函数的return 正常来讲构造函数中是不用写return语句的,因为它会默认返回新创建的对象. 但是, ...
- 微软新神器-Power BI横空出世,一个简单易用,还用得起的BI产品,你还在等什么???
在当前互联网,由于大数据研究热潮,以及数据挖掘,机器学习等技术的改进,各种数据可视化图表层出不穷,如何让大数据生动呈现,也成了一个具有挑战性的可能,随之也出现了大量的商业化软件.今天就给大家介绍一款逆 ...
- 利用Node.js的Net模块实现一个命令行多人聊天室
1.net模块基本API 要使用Node.js的net模块实现一个命令行聊天室,就必须先了解NET模块的API使用.NET模块API分为两大类:Server和Socket类.工厂方法. Server类 ...
- [C#] C# 知识回顾 - 你真的懂异常(Exception)吗?
你真的懂异常(Exception)吗? 目录 异常介绍 异常的特点 怎样使用异常 处理异常的 try-catch-finally 捕获异常的 Catch 块 释放资源的 Finally 块 一.异常介 ...
- python通过protobuf实现rpc
由于项目组现在用的rpc是基于google protobuf rpc协议实现的,所以花了点时间了解下protobuf rpc.rpc对于做分布式系统的人来说肯定不陌生,对于rpc不了解的童鞋可以自行g ...
- 调用微信退款接口或发红包接口时出现System.Security.Cryptography.CryptographicException: 出现了内部错误 解决办法
我总结了一下出现证书无法加载的原因有以下三个 1.证书密码不正确,微信证书密码就是商户号 解决办法:请检查证书密码是不是和商户号一致 2.IIS设置错误,未加载用户配置文件 解决办法:找到网站使用的应 ...
- C# 泛型
C# 泛型 1.定义泛型类 在类定义中包含尖括号语法,即可创建泛型类: class MyGenericClass<T> { //Add code } 其中T可以遵循C#命名规则的任意字符. ...
- Android快乐贪吃蛇游戏实战项目开发教程-06虚拟方向键(五)绘制方向键箭头
本系列教程概述与目录:http://www.cnblogs.com/chengyujia/p/5787111.html本系列教程项目源码GitHub地址:https://github.com/jack ...
- ubuntu15 coreclr
看了很多文章心里痒痒,也下载个ubuntu想发布个asp.net5试试,自然是下载的最新版本15.结果涉及dnu restore,dnx...什么的都没反应,切换为mono就正常,奇怪了,按说core ...