.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 的程序包。

相关文章:

  • ASP.NET Core 1.0 入门——了解一个空项目

  • ASP.NET Core 1.0 部署 HTTPS (.NET Framework 4.5.1)

  • .NET Core 1.0、ASP.NET Core 1.0和EF Core 1.0简介

  • 云服务器下ASP.NET Core 1.0环境搭建(包含mono与coreclr)

  • 使用VS Code开发ASP.NET Core 应用程序

  • dotnet run是如何启动asp.net core站点的

  • ASP.NET Core提供模块化Middleware组件

  • “dotnet restore"和"dotnet run"都做了些什么?

  • 探秘 dotnet run 如何运行 .NET Core 应用程序

  • .NET Portability Analyzer 已开源

  • ASP.NET Core的配置(1):读取配置信息

  • ASP.NET Core的配置(2):配置模型详解

  • .NET Core 1.0 RC2 历险之旅

  • 使用VS Code开发 调试.NET Core 应用程序

  • 让我们Core在一起:ASP.NET Core & .NET Core

  • .NET Core VS Code 环境配置

  • 官方博客明确了 .NET Core RC2/RTM 时间表

  • .NET Core全新的配置管理[共9篇]

  • 利用记事本创建一个ASP.NET Core RC2 MVC应用

  • 微软.NET 正式劈腿成功,横跨所有平台

  • .NET Core 1.0 CentOS7 尝试

  • 解读发布:.NET Core RC2 and .NET Core SDK Preview 1

  • [.NET Core].NET Core R2安装及示例教程

  • 升级ASP.Net Core项目

  • 升级.Net Core RC1的类库项目

  • Entity Framework升级

  • TFS2015的CI集成

  • 结合Jexus + Kestrel 部署 asp.net core 生产环境

  • .NET Core计划弃用project.json

原文地址:http://www.cnblogs.com/xishuai/p/understand-dotnet-platform-standard.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

理解 .NET Platform Standard相关推荐

  1. [Java基础]Scanner的使用(秋招在线笔试高频使用)版本:Java™ Platform Standard Ed. 8...

    本节目讨论的Scanner为Java™ Platform Standard Ed. 8版本,请来自未来的Java同胞确认自己所处的Java版本时间线,未来的Scanner说不定已经改变了很多 最近参加 ...

  2. Java Platform Standard Edition 8 Documentation

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

  3. Java SE (Java Platform, Standard Edition) 技术资源分享

    写在前面的话: 此贴作为技术交流贴,涉及到的书籍和视频教程均是从网上搜集而来,个人觉得非常好,也非常感谢他们的分享精神.在此分享于大家~~也望各位朋友补充与完善,毕竟我一个人整理的不太全面!!! 1. ...

  4. ASP.NET Core 1.0 开发记录

    ASP.NET Core 1.0 更新比较快(可能后面更新就不大了),阅读注意时间节点,这篇博文主要记录用 ASP.NET Core 1.0 开发简单应用项目的一些记录,以备查阅. ASP.NET C ...

  5. 2016.NET Core相关内容回顾

    每一年的脚步的确是快,转眼间马上就2017..NET Core 2014年宣布开源以来,在2016年发布了第一个版本,2017年将发布第二个版本,在这新年之际,我们回顾2016年,新的一年,带着理想和 ...

  6. platform设备驱动模型理解

    platform总线是Linux提供的一种虚拟总线,struct platform_device表示设备,struct platform_driver表示驱动 1> 内核初始化platform总 ...

  7. 对Java三大运行平台(javase,javaee,javame)的理解

    Java SE 是Java平台标准版的简称(Java Platform, Standard Edition) (also known as Java 2 Platform) ,用于开发和部署桌面.服务 ...

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

    [转载自并发编程网 – ifeve.com 原文链接:http://ifeve.com/tag/jmm/] 锁的释放-获取建立的happens before 关系 锁是java并发编程中最重要的同步机 ...

  9. 理解Java和C语言编译原理

    C语言代码的编译原理: http://blog.csdn.net/neil_wesley/article/details/51265457 Java语言的编译原理: http://www.cnblog ...

最新文章

  1. 大数据系统软件国家工程研究中心给大家拜年啦!
  2. 设计ADuC845低噪声信号采集版
  3. java 变量锁_一张图看透java的“锁”事
  4. apicloud使用指南
  5. 构造不可变类及其优点
  6. readdirectorychangesw 链接错误 undeclared identifier 解决方法
  7. Java并发编程实战————可重入内置锁
  8. 栈实现队列(队列实现栈)
  9. 三台虚拟机如何通过GNS3互通
  10. RubyInstaller 在 Windows 环境下的安装
  11. h2o automl_H2O-AutoML
  12. 搞懂微服务,从捕捉一头野猪说起
  13. js大数相加或相减(支持正数或负数)
  14. 【Life】 Never Too Late, Just Do it Better!
  15. 企企通SRM项目再获肯定,助力迈金科技一站式数字化采购平台成功上线
  16. vscode在Windows下配置C语言环境,设置三个配置文件
  17. 引用的账户当前已锁定,且无法登录
  18. Chrome源代码结构
  19. 男教师的着装面试礼仪
  20. 2020.11.07 使用OpenCV进行图像边缘提取(Sobel算子)【OpenCV C++ Sobel】

热门文章

  1. 非常不错 Hadoop 的HDFS (Hadoop集群(第8期)_HDFS初探之旅)
  2. wpf 可以取消的单选checkbox
  3. 自由、开源及其敌人 —— RMS事件簿
  4. 一日一技:ASP.NET Core 判断请求是否为Ajax请求
  5. c#爬虫-1688官网自动以图搜图
  6. 如何在 .Net Core 中使用 IHostedService
  7. 微前端架构在容器平台的应用
  8. 【Hook】postman工具的代码生成工具让它锦上添花
  9. 一款基于.NET Core的认证授权解决方案-葫芦藤1.0开源啦
  10. 【WPF】DataGrid多表头的样式设计