理解 .NET Platform Standard

.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 NameAlias






.NET Platform Standardnetstandard1.01.11.21.31.41.51.6
.NET Corenetcoreapp1.0
.NET Frameworknet4.6.3


4.6.2


4.6.1



4.6




4.5.2





4.5.1





4.5




Universal Windows Platformuap10.0

Windowswin8.1





8.0




Windows Phonewpa8.1



Windows Phone Silverlightwp8.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 系统。

PlatformNuGet identifier
.NET Framework 2.0 - 4.6net20 - net46
.NET Corenetcoreapp
.NET Micro Frameworknetmf
Windows 8win8, netcore45
Windows 8.1win8, netcore451
Windows Phone Silverlight (8, 8.1)wp8, wp81
Windows Phone 8.1wpa8.1
Universal Windows Platform 10uap10, netcore50
Silverlight 4, 5sl4, sl5
MonoAndroidmonoandroid
MonoTouchmonotouch
MonoMacmonomac
Xamarin iOSxamarinios
Xamarin PlayStation 3xamarinpsthree
Xamarin PlayStation 4xamarinpsfour
Xamarin PlayStation Vitaxamarinpsvita
Xamarin Watch OSxamarinwatchos
Xamarin TV OSxamarintvos
Xamarin Xbox 360xamarinxboxthreesixty
Xamarin Xbox Onexamarinxboxone

最后,再做一个测试,这个我们一般在 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 的程序包。


相关文章:


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


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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/329320.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oracle入门(十四.18)之使用动态SQL

一、SQL的执行流程数据库中的所有SQL语句都经历了不同的阶段: •解析:预执行“这可能吗?”检查包括语法,对象存在,权限等 •绑定:获取语句中引用的任何变量的实际值 •执行:语句被执行。•提取&…

天平游码读数例题_初二上册物理实验——托盘天平使用的注意事项

今天给大家讲讲托盘天平的使用和注意事项。(1)首先,我们回忆一下什么是托盘天平如下图托盘天平由底座、横梁、分度盘、托盘、平衡螺母、标尺、游码、托盘等组成,当然还有砝码。托盘天平是称量物体的质量的工具(质量符号m,单位:国际…

3.elasticsearch文档查询dsl

【README】 1.本文elasticsearch版本是 7.2.1; 2.文档查询语句叫做 DSL, domain structure language, 领域特定语言;dsl,参见 Query DSL | Elasticsearch Guide [7.2] | Elastic 3.elasticsearch 基于json 提供了完…

Oracle入门(十四.19)之触发器简介

一、触发器的需求让我们从一个例子开始吧:一条业务规则规定,只要员工的工资发生变化,变更就必须记录在日志记录表中。 可以创建两个过程来执行此操作:UPD_EMP_SAL更新工资,LOG_SAL_CHANGE将行插入日志表。可以从UPD_EM…

搜狐视频Redis私有云cachecloud开源了

项目地址:https://github.com/sohutv/cachecloud/ 一、CacheCloud是做什么的 CacheCloud提供一个Redis云管理平台:实现多种类型(Redis Standalone、Redis Sentinel、Redis Cluster)自动部署、解决Redis实例碎片化现象、提供完善统计、监控、运维功能、减…

springboot 订单重复提交_瞬间几千次的重复提交,我用Spring Boot+Redis扛住了

在实际的开发项目中,一个对外暴露的接口往往会面临,瞬间大量的重复的请求提交,如果想过滤掉重复请求造成对业务的伤害,那就需要实现幂等!我们来解释一下幂等的概念:任意多次执行所产生的影响均与一次执行的…

Oracle入门(十四.21)之创建DML触发器:第二部分

一、使用条件谓词 在上文中,看到了一个触发器,可以防止在周末插入EMPLOYEES: CREATE OR REPLACE TRIGGER secure_emp BEFORE INSERT ON employees BEGINIF TO_CHAR(SYSDATE,DY) IN (SAT,SUN) THENRAISE_APPLICATION_ERROR(-20500,You may ins…

【直播预告】创享未来 2016微软开发者峰会

感谢所有中国开发者对2016微软开发者峰会的热情关注,目前活动已经截止报名了,不过M姐为大家带来新的福利: 2016微软开发者峰会将全程线上直播! 2016微软开发者峰会将全程线上直播! 2016微软开发者峰会将全程线上直播…

定时任务重启后执行策略_C语言操作时间函数time.ctime,实现定时执行某个任务小例子...

时间操作函数在实际项目开发中会经常用到,最近做项目也正好用到就正好顺便整理一下。时间概述由上图可知:通过系统调用函数time()可以从内核获得一个类型为time_t的1个值,该值叫calendar时间,即从1970年1月1日的UTC时间从0时0分0妙…

Oracle入门(十四.20)之创建DML触发器:第一部分

一、什么是DML触发器?DML触发器是执行SQL DML语句(INSERT,UPDATE或DELETE)时自动触发(执行)的触发器。 您可以通过两种方法对DML触发器进行分类: •执行时间:BEFORE,AFTE…

IIS负载均衡-Application Request Route详解第四篇:使用ARR实现三层部署架构

本篇的主要目的是带领大家一起来使用ARR来实现一个三层部署架构。这里的三层部署架构主要是由:服务层,应用程序服务器层已经数据层实现。如下图所示: 每次一提到“层”这个字的时候,似乎感觉这个字特别的惹火。很多朋友开始讨论起…

c遗传算法的终止条件一般_KDD比赛之遗传算法(举例理解)

求最大值问题是这样的:求解函数 f(x) x 10*sin(5*x) 7*cos(4*x) 在区间[0,9]的最大值。这个函数大概长这样:那么如何应用遗传算法如何来找到这个奇怪的函数的最大值呢?事实上,不管一个函数的形状多么奇怪,遗传算法都…

6.elasticsearch查询与过滤上下文(query context与filter contenxt)以及term术语查询

【README】 1.本文总结自: Query and filter context | Elasticsearch Guide [7.2] | Elastichttps://www.elastic.co/guide/en/elasticsearch/reference/7.2/query-filter-context.html2.文档相关性分数是否被计算,取决于查询子句是在查询上下文&…

Oracle入门(十四.22)之创建DDL和数据库事件触发器

一、什么是DDL和数据库事件触发器?DDL语句触发DDL触发器:CREATE,ALTER或DROP。 数据库事件触发器由数据库中的非SQL事件触发,例如: •用户连接到数据库或与数据库断开连接。 •DBA启动或关闭数据库。•用户会话中引发了…

Visual Studio上开发Python?你不可不知道的六大功能!

Visual Studio 2013/2015 搭配 Python Tools for Visual Studio 扩充套件让 Visual Studio 能提供对 Python 程序语言高度整合的开发环境,并完整发挥 Visual Studio 强大的功能,协助您在 Visual Studio 内开发 Python 程序上如虎添翼,提升开发…

qt中sendevent_Qt中postEvent和sendEvent函数

Qt中postEvent和sendEvent函数部分内容参考http://blog.csdn.net/lvmengzou/article/details/65450908qt事件循环需要维护一个事件队列,在Qt的main函数中最后一般调用QApplication::exec()成员函数来保持程序对事件队列的处理,exec()的实质是不停调用pro…

IIS负载均衡-Application Request Route详解第五篇:使用ARR来配置试点项目

看到本篇的题目,大家可能感到有点奇怪!下面,我们就来看看这到底是什么意思。 大家可能遇到过这样的一种情况:希望根据某些请求用户的特性,将用户的请求导向不同的站点(请大家这里区分“亲缘性”的概念&…

Oracle入门(十四.23)之管理触发器

一、触发器需要特权要在模式中创建触发器,需要: •CREATE TRIGGER系统特权 •触发器主体中引用的其他架构中的对象的普通对象特权(SELECT,UPDATE,EXECUTE等) •与触发器关联的表或视图上的ALTER特权。触发器…

为什么哲学是最难的学科_什么是哲学哲学对大师来说可能非常理论化,没有一定哲学基础肯能很难 爱问知识人...

我的总结是科学哲学是从哲学角度考察科学的一门学科。它以科学活动和科学理论为研究对象,探讨科学的本质、科学知识的获得和检验、科学的逻辑结构等有关科学认识论和科学方法论的基本问题。哲学是什么?这是一个问题,一个既简单又复杂的问题。…

8.es更新文档通过版本号实现并发控制

【README】 1.本文介绍了es更新文档时的并发控制策略;2.通过版本号实现并发控制(类似于mysql中基于版本号的乐观锁);3.Es为支持并发控制,为每篇文章设置了版本号_version。初始值为1,每更新1次加1。…