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": {
"dnx451": { },
"dnxcore50": { }
}
frameworks 配置的是什么东西?dnx451 和 dnxcore50 又是什么鬼?
可能了解过 ASP.NTE 5 的童鞋会知道,但如果再深入一些,就必须搞清楚 ASP.NTE 5 相关内容的来龙去脉,幸好几个月之前,我写过几篇类似的博文,不过现在已经忘的差不多了,而且 ASP.NTE 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 工具、即时编译运行时(上面说到的 .NTE 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.NTE 5 Target framework dnx451 and dnxcore50(转)原文:http://www.cnblogs.com/xishuai/p/aspnet5-target-framework-dnx451-and-dnxcore50.html的更多相关文章
- ASP.NET缓存全解析1 转自网络原文作者李天平
有时候总听到网友说网站运行好慢,不知如何是好:有时候也总见到一些朋友写的网站功能看起来非常好,但访问性能却极其的差.没有“勤俭节约”的意识,势必会造成“铺张浪费”.如何应对这种情况,充分利用系统缓存则 ...
- [渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:为ASP.NET MVC应用程序使用异步及存储过程
这是微软官方教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译,这里是第九篇:为ASP.NET MVC应用程序 ...
- API基础开发学习网址
http://www.cnblogs.com/shanyou/category/307401.html http://www.cnblogs.com/beginor/archive/2012/03/1 ...
- 什么是目标框架别名(What are the Target Framework Monikers (TFMs))?
我们现在的.NET Core 1.0应用(ASP.NET Core 1.0应用或控制台应用)有了新的被运行在不同框架上的可能性:①运行在.NET Core平台上 ②运行在传统的.NET Framewo ...
- ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第二章:利用模型类创建视图、控制器和数据库
在这一章中,我们将直接进入项目,并且为产品和分类添加一些基本的模型类.我们将在Entity Framework的代码优先模式下,利用这些模型类创建一个数据库.我们还将学习如何在代码中创建数据库上下文类 ...
- 开发 ASP.NET vNext 续篇:云优化的概念、Entity Framework 7.0、简单吞吐量压力测试
继续上一篇<开发 ASP.NET vNext 初步总结(使用Visual Studio 2014 CTP1)>之后, 关于云优化和版本控制: 我本想做一下MAC和LINUX的self-ho ...
- Asp.Net MVC 模型(使用Entity Framework创建模型类) - Part.1
这篇教程的目的是解释在创建ASP.NET MVC应用程序时,如何使用Microsoft Entity Framework来创建数据访问类.这篇教程假设你事先对Microsoft Entity Fram ...
- Asp.Net MVC 模型(使用Entity Framework创建模型类)
这篇教程的目的是解释在创建ASP.NET MVC应用程序时,如何使用Microsoft Entity Framework来创建数据访问类.这篇教程假设你事先对Microsoft Entity Fram ...
- [转]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 ...
随机推荐
- Edittext焦点处理
<LinearLayout android:focusable="true" android:layout_width="0dp" android:lay ...
- LeetCode:Pascal's Triangle I II
LeetCode:Pascal's Triangle Given numRows, generate the first numRows of Pascal's triangle. For examp ...
- 一个bug案例分析
Bug描述: 某大型系统的一个提供基础数据服务的子系统A进行了一次升级.升级的内容为:优化了失败重传功能,在优化的同时,开发人员发现传输数据的时间戳精度只是精确到了秒,于是顺手把精度改成了1/100秒 ...
- ASP.NET MVC 5 入门教程 (2) 控制器Controller
文章来源: Slark.NET-博客园 http://www.cnblogs.com/slark/p/mvc-5-get-started-controller.html 上一节:ASP.NET MVC ...
- 如何启动一个已经创建的docker 容器,并进入SHELL 对其操作
腾讯云使用自己的docker镜像安装后无法启动,下边这个亲测是可用的 sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 36A ...
- C#基础之内存分配
1.创建一个对象 一个对象的创建过程主要分为内存分配和初始化两个环节.在.NET中CLR管理的内存区域主要有三部分:栈.GC堆.LOH堆,栈主要用来分配值类型数据.它的管理是有系统控制的,而不是像GC ...
- .net架构设计读书笔记--第二章 设计体系结构
第五节 探索领域架构 一.领域驱动设计的价值与意义 最初在java中使用,.net要晚些才引入.领域驱动设计出现之初的争议.一个向导,少走弯路 1. 我们真的需要DDD吗? DDD并不适用于每个软 ...
- 缓存插件 Spring支持EHCache缓存
Spring仅仅是提供了对缓存的支持,但它并没有任何的缓存功能的实现,spring使用的是第三方的缓存框架来实现缓存的功能.其中,spring对EHCache提供了很好的支持. 在介绍Spring的缓 ...
- Java 集合类详解(含类图)
0.参考文献 此图中蓝色为抽象类.深红色表示接口(Arrays除外).绿色表示具体容器类 1.java集合类图 1.1 1.2 上述类图中,实线边框的是实现类,比如ArrayList,LinkedLi ...
- CSS布局自适应高度解决方法
这是一个比较典型的三行二列布局,每列高度(事先并不能确定哪列的高度)的相同,是每个设计师追求的目标,按一般的做法,大多采用背景图填充.加JS脚本的方法使列的高度相同,本文要介绍的是采用容器溢出部分隐藏 ...