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

"frameworks": {
"dnx451": { },
"dnxcore50": { }
}

frameworks 配置的是什么东西?dnx451 和 dnxcore50 又是什么鬼?

可能了解过 ASP.NET 5 的童鞋会知道,但如果再深入一些,就必须搞清楚 ASP.NET 5 相关内容的来龙去脉,幸好几个月之前,我写过几篇类似的博文,不过现在已经忘的差不多了,而且 ASP.NET 5 的变化也非常大,现在又重读了之前写的博文,然后又 Google 了一下资料,回忆的差不多了,再记录一遍。

之前的相关博文:

首先,再明确下 .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 配置选项:

  • dnxcore50 DNX SDK running on CoreCLR/CoreFx
  • dnx451 DNX 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.0 UWP SDK running on .Net Native/CoreFx
  • dotnet any 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 Framework
  • dnxcore* 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 则不可以引用。

参考资料:

ASP.NET 5 Target framework dnx451 and dnxcore50的更多相关文章

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

  2. 什么是目标框架别名(What are the Target Framework Monikers (TFMs))?

    我们现在的.NET Core 1.0应用(ASP.NET Core 1.0应用或控制台应用)有了新的被运行在不同框架上的可能性:①运行在.NET Core平台上 ②运行在传统的.NET Framewo ...

  3. vNext之旅(2):net451、dotnet5.4、dnx451、dnxcore50都是什么鬼

    继上次"vNext之旅(1):从概念和基础开始"之后再次学习vNext重新遇到了弄不懂的事情,花了一些时间学习,今天来分享一下,为后人节省些时间. 起因 在用vNext造轮子--框 ...

  4. ABP 教程文档 1-1 手把手引进门之 ASP.NET Core & Entity Framework Core(官方教程翻译版 版本3.2.5)

    本文是ABP官方文档翻译版,翻译基于 3.2.5 版本 官方文档分四部分 一. 教程文档 二.ABP 框架 三.zero 模块 四.其他(中文翻译资源) 本篇是第一部分的第一篇. 第一部分分三篇 1- ...

  5. ASP.NET MVC - Entity Framework

    ASP.NET MVC - Entity Framework 实体关系 关系是某个实体(表)的一条记录对应于另一个实体(表)的一条或多条记录. 一对多关系 单方面的包含关系称为一对多,而一对多和一对一 ...

  6. Vs2013 坑爹的Target framework问题

    之前的一个项目是使用Vs2008来开发的,因为这段时间家里有事情所以只能跟经理协商在家里来做此项目,因为家里的VS是2013的所以在迁移时没有什么问题 但今天我更改一个类库的文件后重新生成解决方案结果 ...

  7. 使用ASP.NET MVC+Entity Framework快速搭建系统

    详细资料: http://www.cnblogs.com/dingfangbo/p/5771741.html 学习 ASP.NET MVC 也有一段时间了,打算弄个小程序练练手,做为学习过程中的记录和 ...

  8. ASP.NET Identity + Entity Framework 6 注意

    最近一个项目使用ASP.NET Identity + Entity Framework 6开发,本来一切正常. 某时注意到,更改密码功能程序执行起来没有问题,界面上也报修改密码成功,但实际上密码并没有 ...

  9. [转]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 ...

随机推荐

  1. Npm包的开发

    个人开发包的目录结构 ├── coverage //istanbul测试覆盖率生成的文件 ├── index.js //入口文件 ├── introduce.md //说明文件 ├── lib │   ...

  2. ASP.NET Core MVC/WebAPi 模型绑定探索

    前言 相信一直关注我的园友都知道,我写的博文都没有特别枯燥理论性的东西,主要是当每开启一门新的技术之旅时,刚开始就直接去看底层实现原理,第一会感觉索然无味,第二也不明白到底为何要这样做,所以只有当你用 ...

  3. Mono为何能跨平台?聊聊CIL(MSIL)

    前言: 其实小匹夫在U3D的开发中一直对U3D的跨平台能力很好奇.到底是什么原理使得U3D可以跨平台呢?后来发现了Mono的作用,并进一步了解到了CIL的存在.所以,作为一个对Unity3D跨平台能力 ...

  4. Unity游戏内版本更新

    最近研究了一下游戏内apk包更新的方法. ios对于应用的管理比较严格,除非热更新脚本,不太可能做到端内大版本包的更新.然而安卓端则没有此限制.因此可以做到不跳到网页或应用商店,就覆盖更新apk包. ...

  5. 按需加载.js .css文件

    首先,理解按需加载当你需要用到某个js里面的函数什么鬼,或者某个css里的样式的时候你才开始加载这个文件. 然后是怎样实现的,简单来说就是在js中动态的createElem<script> ...

  6. .Net Core MVC 网站开发(Ninesky) 2.2、栏目管理功能-System区域添加

    在asp或asp.net中为了方便网站的结构清晰,通常把具有类似功能的页面放到一个文件夹中,用户管理功能都放在Admin文件夹下,用户功能都放在Member文件夹下,在MVC中,通常使用区域(Area ...

  7. 6. ModelDriven拦截器、Preparable 拦截器

    1. 问题 Struts2 的 Action 我们将它定义为一个控制器,但是由于在 Action 中也可以来编写一些业务逻辑,也有人会在 Action 输入业务逻辑层. 但是在企业开发中,我们一般会将 ...

  8. 玩转spring boot——开篇

    很久没写博客了,而这一转眼就是7年.这段时间并不是我没学习东西,而是园友们的技术提高的非常快,这反而让我不知道该写些什么.我做程序已经有十几年之久了,可以说是彻彻底底的“程序老炮”,至于技术怎么样?我 ...

  9. Spring之初体验

                                     Spring之初体验 Spring是一个轻量级的Java Web开发框架,以IoC(Inverse of Control 控制反转)和 ...

  10. arcgis api for js入门开发系列四地图查询(含源代码)

    备注:由于实现本篇功能的需求,修改了地图数据的dlsearch.mxd,然后更新了地图服务,需要的在文章最后有提供最新的mxd以及源代码下载的 上一篇实现了demo的地图工具栏,本篇新增地图查询功能, ...