相关博文:ASP.NET 5 Target framework dnx451 and dnxcore50

.NET Platform Standard:https://github.com/dotnet/corefx/blob/master/Documentation/architecture/net-platform-standard.md

.NET Platform Standard 是什么?直译过来就是 .NET 平台规范或标准,它的目的就是使 .NET 各个平台之间更加统一和规范,在之前的 .NET Core RC2 发布文章中提到了 .NET Standard Library,它其实就是 .NET Platform Standard 的体现之一,.NET Standard Library 现在有一个对应程序包NETStandard.Library,它的作用是兼容各个 .NET Platform,这个后面有进行说明,现在只是一个临时方案,以后微软慢慢会把相关的程序包(比如基础类库等),按照 .NET Standard Library 的标准进行开发和发布。

.NET Platform Standard 列表:

Target Platform Name Alias
.NET Platform Standard netstandard 1.0 1.1 1.2 1.3 1.4 1.5 1.6
.NET Core netcoreapp 1.0
.NET Framework net 4.6.3
4.6.2
4.6.1
4.6
4.5.2
4.5.1
4.5
Universal Windows Platform uap 10.0
Windows win 8.1
8.0
Windows Phone wpa 8.1
Windows Phone Silverlight wp 8.1
8.0
Mono/Xamarin Platforms *
Mono *

上面这些都是概念,我们在 ASP.NET Core 1.0 RC2 项目开发中,如何应用和体现呢?其实就是我们在project.json中配置的frameworks节点,我们先看一段配置(来自 Microsoft.EntityFrameworkCore/project.json):

"frameworks": {
"net451": {
"frameworkAssemblies": {
"System.ComponentModel.DataAnnotations": "",
"System.Runtime": {
"type": "build"
}
}
},
"netstandard1.3": {
"imports": [
"portable-net452+win81"
],
"dependencies": {
"System.Collections.Concurrent": "4.0.12-*",
"System.ComponentModel.Annotations": "4.1.0-*",
"System.Linq.Queryable": "4.0.1-*",
"System.ObjectModel": "4.0.12-*",
"System.Reflection.Extensions": "4.0.1-*",
"System.Reflection.TypeExtensions": "4.1.0-*"
}
},
"netcore50": {
"dependencies": {
"Microsoft.NETCore.Platforms": {
"type": "build",
"version": "1.0.1-*"
},
"System.Collections.Concurrent": "4.0.10",
"System.ComponentModel.Annotations": "4.0.10",
"System.Linq.Queryable": "4.0.0",
"System.ObjectModel": "4.0.10",
"System.Reflection.Extensions": "4.0.0",
"System.Reflection.TypeExtensions": "4.0.0",
"System.Runtime": {
"type": "build",
"version": "4.0.20"
},
"System.Dynamic.Runtime": {
"type": "build",
"version": "4.0.10"
},
"System.Runtime.WindowsRuntime": {
"type": "build",
"version": "4.0.10"
},
"System.Runtime.Extensions": {
"type": "build",
"version": "4.0.10"
}
}
}
}

可以看到frameworks配置了net451netstandard1.3netcore50,这些是什么意思?从上面的 .NET Platform Standard 列表中,我们可以得到一些信息,但还是有些不太明白,我们看一下相关解释(来自 Project.json definition dnx451 vs .dotnet (4.51)):

  • dnxcore50: DNX SDK running on CoreCLR/CoreFx (deprecated, use netcoreapp1.0 instead).
  • dnx451: DNX SDK running on .Net 4.5.1 (Desktop CLR / Full BCL and FCL) (deprecated, use net451 instead).
  • net46: .Net Framework 4.6 SDK running on Desktop CLR / Full BCL and FCL.
  • uap10.0: UWP Windows 10 SDK running on .Net Native/CoreFx.
  • netcoreapp1.0: .NET Core 1.0 SDK running on CoreCLR/CoreFx.
  • netstandard1.5: (RC2, dotnet before) any pure IL code which declares its dependencies (System.Runtime (based) libraries instead of a PCL contracts). Framework dependencies are available for .Net 4.5.x onwards, .NET Core or UWP (System.Runtime based library set in different versions). As with RC2 dotnet is deprecated, use netstandard instead.

先看dnxcore50的解释,DNX SDK 是什么?它其实是一种命令或工具,指向你的程序集使用的哪种目标环境,CoreCLR/CoreFx 就是说,程序集跑在 CoreCLR/CoreFx 上,dnxcore50现在已经被弃用了,被 netcoreapp1.0所替代,netstandard1.5是一种新的平台规范,使用它必须引用NETStandard.Library程序包,否则System所有相关命名空间都找不到。

简单来说,frameworks所配置的就是你程序集的运行环境或平台,如果配置了多个,就表示程序集可以跑在多个平台上,比如,上面Microsoft.EntityFrameworkCore配置了net451netstandard1.3netcore50,也就是说Microsoft.EntityFrameworkCore可以被这三种平台的程序集引用,比如你的程序集frameworks中只配置了net451,照样可以引用Microsoft.EntityFrameworkCore程序集,只不过只能在 Windows 上运行,不能跨平台而已,一个程序集不同平台的代码写法:

#if DNX451
//Code here for dnx451
#elif DNXCORE50
//code here for dnxcore50
#endif

imports的解释是(来自 Frameworks and imports sections in project.json: what are they?):imports is a way to use packages that were not designed for that framework. Basically you tell it "Use those targets even though they don't seem to be supported. I know what I'm doing". 简单来说,就是兼容本程序集配置平台所不支持的平台,有点绕,我们做一个测试就清楚了:

如上图的配置,为什么frameworks配置了netcoreapp1.0会出现错误?因为我们引用的Microsoft.EntityFrameworkCore程序包并不完全支持netcoreapp1.0平台,所以我们需要在netcoreapp1.0下增加"imports": ["net451"] 配置,其作用就是使之兼容,当然现在只是兼容平台的配置,以后完善之后,这个配置会去掉的。

imports 的一段配置:

"netcoreapp1.0": {
"imports": [
"net461",
"portable-net45+win81"
]
}

首先,imports 可以配置多个节点,portable-net45+win81是什么意思?portable 的意思是便携式的,在之前的博文中有提及,意思就是自身发布不携带依赖的程序包,而是使用系统中安装配置的,net45就是上面说的frameworks配置,win81是系统平台的意思,但不只是特指 Windows 8.1 系统。

Platform NuGet identifier
.NET Framework 2.0 - 4.6 net20 - net46
.NET Core netcoreapp
.NET Micro Framework netmf
Windows 8 win8, netcore45
Windows 8.1 win8, netcore451
Windows Phone Silverlight (8, 8.1) wp8, wp81
Windows Phone 8.1 wpa8.1
Universal Windows Platform 10 uap10, netcore50
Silverlight 4, 5 sl4, sl5
MonoAndroid monoandroid
MonoTouch monotouch
MonoMac monomac
Xamarin iOS xamarinios
Xamarin PlayStation 3 xamarinpsthree
Xamarin PlayStation 4 xamarinpsfour
Xamarin PlayStation Vita xamarinpsvita
Xamarin Watch OS xamarinwatchos
Xamarin TV OS xamarintvos
Xamarin Xbox 360 xamarinxboxthreesixty
Xamarin Xbox One xamarinxboxone

最后,再做一个测试,这个我们一般在 ASP.NET 5 Core 1.0 RC1 升级到 RC2 中会遇到的,两个程序集:

  • CNBlogs.Ad.Infrastructure.Interfaces
  • CNBlogs.Ad.Infrastructure: 依赖于CNBlogs.Ad.Infrastructure.Interfaces

CNBlogs.Ad.Infrastructure.Interfacesproject.json配置:

{
"version": "1.0.0-*",
"description": "CNBlogs.Ad.Infrastructure.Interfaces Class Library",
"authors": [ "xishuai" ],
"frameworks": {
"netcoreapp1.0": {
"imports": [
"net451"
]
},
"net451": { }
},
"dependencies": {
"Microsoft.EntityFrameworkCore": "1.0.0-rc2-final",
"Microsoft.EntityFrameworkCore.SqlServer": "1.0.0-rc2-final"
}
}

CNBlogs.Ad.Infrastructureproject.json配置:

{
"version": "1.0.0-*",
"description": "CNBlogs.Ad.Infrastructure Class Library",
"authors": [ "xishuai" ],
"frameworks": {
"netcoreapp1.0": {
"imports": [
"net451"
]
},
"net451": { }
},
"dependencies": {
"CNBlogs.Ad.Infrastructure.Interfaces": "1.0.0-*",
"Microsoft.EntityFrameworkCore": "1.0.0-rc2-final",
"Microsoft.EntityFrameworkCore.SqlServer": "1.0.0-rc2-final"
}
}

几种测试情况:

  • CNBlogs.Ad.Infrastructure.Interfaces中的netcoreapp1.0去除"imports": ["net451"]配置:出现错误,上面有过分析,因为Microsoft.EntityFrameworkCore并不完全支持netcoreapp1.0
  • CNBlogs.Ad.Infrastructure.Interfaces去除netcoreapp1.0配置:出现错误,因为CNBlogs.Ad.Infrastructure配置了netcoreapp1.0,而引用的CNBlogs.Ad.Infrastructure.Interfaces却支持net451
  • CNBlogs.Ad.Infrastructure.Interfaces去除net451配置:出现错误,同上,因为CNBlogs.Ad.Infrastructure配置了net451,而引用的CNBlogs.Ad.Infrastructure.Interfaces却支持netcoreapp1.0
  • CNBlogs.Ad.Infrastructure去除netcoreapp1.0配置:成功,因为依赖的CNBlogs.Ad.Infrastructure支持net451
  • CNBlogs.Ad.Infrastructure去除net451配置:出现成功,同上,因为依赖的CNBlogs.Ad.Infrastructure支持netcoreapp1.0

综合上面的测试,简单来说,就是程序包的运行平台或环境取决于底层的引用,底层的引用指的是你自己项目中的程序包,而不是基础类库和微软开发的程序包,因为它们都支持多平台,比如上面的Microsoft.EntityFrameworkCore程序包。

另外,如果你的程序包frameworks配置的是net451,它其实和 .NET Core 没多大关系了,因为它使用的是 .NET Framework 和 Desktop CLR,而不是 CoreCLR 和 CoreFx,即使你项目中使用的是 .NET Core RC2 的程序包。

参考资料:

理解 .NET Platform Standard的更多相关文章

  1. Java Platform Standard Edition 8 Documentation

    下面这个图挺有用的,收藏一下. Oracle has two products that implement Java Platform Standard Edition (Java SE) 8: J ...

  2. NET Platform Standard

    NET Platform Standard 相关博文:ASP.NET 5 Target framework dnx451 and dnxcore50 .NET Platform Standard:ht ...

  3. ASP.NET Core 1.0 开发记录

    官方资料: https://github.com/dotnet/core https://docs.microsoft.com/en-us/aspnet/core https://docs.micro ...

  4. 关于ASP.Net的一些概念 转载

    ①理解 .NET Platform Standard 作者:田园里的蟋蟀 http://www.cnblogs.com/xishuai/archive/2016/05/24/understand-do ...

  5. Java多线程 -- 深入理解JMM(Java内存模型) --(五)锁

    锁的释放-获取建立的happens before 关系 锁是Java并发编程中最重要的同步机制.锁除了让临界区互斥执行外,还可以让释放锁的线程向获取同一个锁的线程发送消息. 下面是锁释放-获取的示例代 ...

  6. ionic cordova platform --help

    ionic platform add android 给我报这个问题,不理解 The platform command has been renamed. To find out more, run: ...

  7. 深入理解JMM(Java内存模型) --(五)锁

    锁的释放-获取建立的happens before 关系 锁是Java并发编程中最重要的同步机制.锁除了让临界区互斥执行外,还可以让释放锁的线程向获取同一个锁的线程发送消息. 下面是锁释放-获取的示例代 ...

  8. Linux驱动中的platform总线分析

    copy from :https://blog.csdn.net/fml1997/article/details/77622860 概述 从Linux2.6内核起,引入一套新的驱动管理和注册机制:pl ...

  9. .NET Core系列 : 2 、project.json 这葫芦里卖的什么药

    .NET Core系列 : 1..NET Core 环境搭建和命令行CLI入门 介绍了.NET Core环境,本文介绍.NET Core中最重要的一个配置文件project.json的相关内容.我们可 ...

随机推荐

  1. Tomcat一个BUG造成CLOSE_WAIT

    之前应该提过,我们线上架构整体重新架设了,应用层面使用的是Spring Boot,前段日子因为一些第三方的原因,略有些匆忙的提前开始线上的内测了.然后运维发现了个问题,服务器的HTTPS端口有大量的C ...

  2. 【趣事】用 JavaScript 对抗 DDOS 攻击

    继续趣事分享. 上回聊到了大学里用一根网线发起攻击,今天接着往后讲. 不过这次讲的正好相反 -- 不是攻击,而是防御.一个奇葩防火墙的开发经历. 第二学期大家都带了电脑,于是可以用更高端的方法断网了. ...

  3. Redis/HBase/Tair比较

    KV系统对比表 对比维度 Redis Redis Cluster Medis Hbase Tair 访问模式    支持Value大小 理论上不超过1GB(建议不超过1MB) 理论上可配置(默认配置1 ...

  4. 谈谈一些有趣的CSS题目(四)-- 从倒影说起,谈谈 CSS 继承 inherit

    开本系列,讨论一些有趣的 CSS 题目,抛开实用性而言,一些题目为了拓宽一下解决问题的思路,此外,涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题中有你感觉 ...

  5. Velocity初探小结--velocity使用语法详解

    做java开发的朋友一般对JSP是比较熟悉的,大部分人第一次学习开发View层都是使用JSP来进行页面渲染的,我们都知道JSP是可以嵌入java代码的,在远古时代,java程序员甚至在一个jsp页面上 ...

  6. Android Butterknife 8.4.0 使用方法总结

    转载请标明出处:http://www.cnblogs.com/zhaoyanjun/p/6016341.html 本文出自[赵彦军的博客] 前言 ButterKnife 简介 ButterKnife是 ...

  7. hasOwnProperty()、propertyIsEnumerable()和isPrototypeOf()的用法

    javascript中有原型这么一个概念,任何一个构造函数都有它对应的原型(prototype),我们可以给这个原型赋予一些我们想要的属性,像下面这样: function Gadget(name, c ...

  8. 写给.NET开发者的数据库Migration方案

    微软给我们提供了一种非常好用的数据库迁移方案,但是我发现周围的同学用的并不多,所以我还是想把这个方案整理一下..NET选手看过来,特别是还在通过手工执行脚本来迁移数据库的同学们,当然你也可以选择EF的 ...

  9. 架构之路(九)Session Per Request

    前面的两篇反应很差:没评论没赞.很伤心啊,为什么呢?搞得我好长一段时间都没更新了——呵呵,好吧,我承认,这只是我的借口.不过,还是希望大家多给反馈.没有反馈,我就只能猜了:前面两篇是不是写得太“粗”了 ...

  10. .NET中使用Redis

    Redis是一个用的比较广泛的Key/Value的内存数据库,新浪微博.Github.StackOverflow 等大型应用中都用其作为缓存,Redis的官网为http://redis.io/. 最近 ...