NET Platform Standard
NET Platform Standard
相关博文: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配置了net451、netstandard1.3和netcore50,这些是什么意思?从上面的 .NET Platform Standard 列表中,我们可以得到一些信息,但还是有些不太明白,我们看一下相关解释(来自 Project.json definition dnx451 vs .dotnet (4.51)):
dnxcore50: DNX SDK running on CoreCLR/CoreFx (deprecated, usenetcoreapp1.0instead).dnx451: DNX SDK running on .Net 4.5.1 (Desktop CLR / Full BCL and FCL) (deprecated, usenet451instead).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,dotnetbefore) 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 RC2dotnetis deprecated, usenetstandardinstead.
先看dnxcore50的解释,DNX SDK 是什么?它其实是一种命令或工具,指向你的程序集使用的哪种目标环境,CoreCLR/CoreFx 就是说,程序集跑在 CoreCLR/CoreFx 上,dnxcore50现在已经被弃用了,被 netcoreapp1.0所替代,netstandard1.5是一种新的平台规范,使用它必须引用NETStandard.Library程序包,否则System所有相关命名空间都找不到。
简单来说,frameworks所配置的就是你程序集的运行环境或平台,如果配置了多个,就表示程序集可以跑在多个平台上,比如,上面Microsoft.EntityFrameworkCore配置了net451、netstandard1.3和netcore50,也就是说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.InterfacesCNBlogs.Ad.Infrastructure: 依赖于CNBlogs.Ad.Infrastructure.Interfaces
CNBlogs.Ad.Infrastructure.Interfaces的project.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.Infrastructure的project.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 的程序包。
参考资料:
- Project.json definition dnx451 vs .dotnet (4.51)
- Target Frameworks
- Project.json Frameworks
- What frameworks are available in ASP.NET Core (ASP.NET 5) applications?
- .NET Platform Standard
- Frameworks and imports sections in project.json: what are they?
- All about httpRuntime targetFramework
- Project.json Usage
NET Platform Standard的更多相关文章
- 理解 .NET Platform Standard
相关博文:ASP.NET 5 Target framework dnx451 and dnxcore50 .NET Platform Standard:https://github.com/dotne ...
- Java Platform Standard Edition 8 Documentation
下面这个图挺有用的,收藏一下. Oracle has two products that implement Java Platform Standard Edition (Java SE) 8: J ...
- .NET Core系列 : 2 、project.json 这葫芦里卖的什么药
.NET Core系列 : 1..NET Core 环境搭建和命令行CLI入门 介绍了.NET Core环境,本文介绍.NET Core中最重要的一个配置文件project.json的相关内容.我们可 ...
- ASP.NET Core project.json imports 是什么意思?
示例代码: "frameworks": { "netcoreapp1.0.0": { "imports" : "portable- ...
- ASP.NET Core 1.0 开发记录
官方资料: https://github.com/dotnet/core https://docs.microsoft.com/en-us/aspnet/core https://docs.micro ...
- Java 经典入门(一)
一.什么是 Java 技术?为何需要 Java? Java 是由 Sun Microsystems 在 1995 年首先发布的编程语言和计算平台.有许多应用程序和 Web 站点只有在安装 Java 后 ...
- 【搬砖】安卓入门(1)- Java开发入门
01.01_计算机基础知识(计算机概述)(了解) A:什么是计算机?计算机在生活中的应用举例 计算机(Computer)全称:电子计算机,俗称电脑.是一种能够按照程序运行,自动.高速处理海量数据的现代 ...
- Java 教程整理:基础、项目全都有
Java 在编程语言排行榜中一直位列前排,可知 Java 语言的受欢迎程度了. 网上有很多 Java 教程,无论是基础入门还是开发小项目的教程都比比皆是,可是系统的很少,对于Java 学习者来说找到系 ...
- The .NET of Tomorrow
Ed Charbeneau(http://developer.telerik.com/featured/the-net-of-tomorrow/) Exciting times lie ahead f ...
随机推荐
- [置顶] 如何判断两个IP大小关系及是否在同一个网段中
功能点 判断某个IP地址是否合法 判断两个IP地址是否在同一个网段中 判断两个IP地址的大小关系 知识准备 IP协议 子网掩码 Java 正则表达式 基本原理 IP地址范围 0.0.0.0- 255 ...
- 【Leetcod】Unique Binary Search Trees II
给定结点数n,结点值为1,2,...,n,求由这些结点可以构成的所有二叉查找树. Given n, generate all structurally unique BST's (binary sea ...
- Flowers(二分水过。。。)
Flowers Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ...
- 【原创】Android 系统稳定性 - ANR(二)
文章都为原创,转载请注明出处,未经允许而盗用者追究法律责任. 很久之前写的了,留着有点浪费,共享之.编写者:李文栋P.S. OpenOffice粘贴过来后格式有些混乱. 1.2 如何分析ANR问题 引 ...
- SymmetricDS文档翻译--【Chapter 3. 具体配置(Configuration)[section C]】
3.6. Routers 眼下的实现中提供的Route实现包括: 1. Default Router:这个Router发送全部的数据到Router中定义的目标节点所属的组中的全部的节点. 2 ...
- CentOS下Samba文件服务器的安装与配置
CentOS下Samba文件服务器的安装与配置 http://blog.csdn.net/limingzhong198/article/details/22064801 一.安装配置 1. 安装sam ...
- ACM 做题过程中的一些小技巧。
ACM做题过程中的一些小技巧. 1.一般用C语言节约空间,要用C++库函数或STL时才用C++; cout.cin和printf.scanf最好不要混用. 2.有时候int型不够用,可以用long l ...
- 使用ant的war任务打包j2ee web项目
<?xml version="1.0" encoding="UTF-8"?> <project name="antwebprojec ...
- 使用ant的jar任务打jar包
<?xml version="1.0" encoding="UTF-8"?> <project name="javaTest&quo ...
- 自己python程序的并行修改
遇到运算量大的程序,学习了下python并行运算的方法,在自己的程序上进行了修改,看看是否可以增加效率.原始代码是: import gt_apps as my_apps f=file('sample. ...