(转).Net基础体系和跨框架开发普及
在园子里看到了一篇关于.net体系及框架开发的文章,感触颇深,身为一个.net程序员,发现自己在这方面的跟进和理解远远不够。转到自己这里,分享的同时方便日后查看。
原文链接: http://www.cnblogs.com/sunhoy/p/6371178.html
基础概念
.Net 本身是一个通用开发平台,我个人的理解主要分位如下两个层面:1. 语言层面,2. 运行时
首先:在语言层面上
面向 .net 平台的顶层开发语言有很多,常见的如:C#,F#和Visual Basic等,.net框架提供了这些语言使用的公共语言运行时,运行时与具体的语言无关,它定义了这些语言的公共规范,像类型系统,文件格式等。
这些高级语言编写的代码被称为托管代码,这些代码需要通过编译器编译为中间代码(IL),然后由公共语言运行时(CLR)接管,再经过JIT编译为机器代码交给cpu运行。
公共语言运行时自动处理对象布局并管理对象引用,当不再使用对象时释放它们。 按这种方式实现生存期管理的对象称为托管数据。 垃圾回收消除了内存泄漏以及其他一些常见的编程错误。
其次:运行时层面
当前.net的运行时主要有.Net Framework, Mono for Xamarin和.Net Core 。这些运行时在不同是时期主要是为了解决当时所面临的问题衍生而出,这里介绍下他们相互的关联和职责。
1. .Net Framework ,这个是自2002年就已存在的.Net运行时,也是现在开发人员还在经常使用的框架。涵盖了桌面,web等应用,同时包含了一些特定于windows的api,不过其只能运行在windows平台的限制,给对跨系统平台要求较高的开发需求造成很大的困难,非常适合用于桌面应用的开发。
2. Mono for Xamarin ,这个是当时为了实现.net 的跨系统运行,在2004年非官方组织发布的一个.Net运行时,当时主要是能够支持在.net framework下编写的代码在linux等系统下运行,当前主要包含适用于 iOS、Android、Xamarin.Forms 和 Xamarin.Mac 的 API。 Mono for Xamarin 非常适合生成 iOS 和 Android 移动应用程序。
3. .Net Core 这个是微软官方发布的.Net运行时,主要为了打破.net framework的系统限制,实现跨操作系统平台的开发,在一定程序上正在取代后者,官方定义它是 ASP.NET Core 和通用 Windows 平台 (UWP) 所使用的运行时。 它新式、高效,专用于处理大规模的服务器和云工作负荷。
这三个运行时,.Net 开发人员一定要有一个清醒的认识,他们之间的关系见下图,我们搞清楚运行时之间的关系之后,就可以继续了解三者之间类库框架的关系了

跨框架开发介绍
上边主要介绍的是当前的.net 平台的基信息,同时,因为系统支持的不同,在不同运行时下的支持框架又会有自己不同的特性。 特别是在.Net Core 的逐渐成熟,新旧项目的跨框架支持的需求会越来越多,如何跨框架类库共享,旧项目如何扩展支持是个不得不面对的问题。
如何跨框架开发,微软在这个问题上先后给出了两个解决方案,一是创建多目标.net core 项目,第二个是创建可移植类库(Portable)或标准库(.Net Standard),第一种方式的实现我会在下边的实现中讲解,这里先介绍下第二种方式的由来,这两种在作用上目的是一样的,只是范围和方式略微有所不同,其中.Net Standard 被认为是最好的解决方案。
.Net Standard的官方解释是:.NET 标准库是一套正式的 .NET API 规范,有望在所有 .NET 运行时中推出。 推出标准库的动机是在 .NET 生态系统中建立更好的统一性。 ECMA 335 持续为 .NET 运行时行为建立统一性,但适用于 .NET 库实现的 .NET 基类库 (BCL) 没有类似的规范。
其主要目的就是规范 .net 不同运行时下的框架,提出一套可以通用的api标准。先来看看当前微软官方框架以及当前版本的详细信息:

也就是其他框架可以实现自己的特性,但同时也要实现对应的.net standard框架api,那么就可以在有需求的框架类库中直接使用对应版本的.net standard框架的类库。下边给出.net standard和其他框架(图中叫平台)的版本对照关系:

如果我们需要新建的项目能够同时支持.net core 和 .net framework那么我们只需要在vs 2017中新建一个.net standard类库就好了,如果你使用的是vs2015,那你可以新建 可移植类库[英文版对应: Class Library (Portable) ],然后在属性的窗口下切换到.Net Standard 类库即可。
可移植类库和标准库目的都是一样,主要是影响的上有所不同,新建可移植类库是会让你选择对应的框架,当前类库的实现接口取所选框架的交集,而标准库则和具体框架无关,对应版本的接口都已规范好。
跨框架开发实现
当你需要同时对单一项目提供对.net core 和framework的支持,有两种情况我们可以选择,分别是直接建立.net core多目标项目和 建立可移植类库或者标准库
1. 使用多目标.net core 项目
使用这个方式主要场景是 必须对某些项目提供framework的特殊功能支持,同时又不希望建立两个独立的项目。
这种方式的好处是单个项目能够快速编译出不同的目标版本dll,劣势是可能无法在同一解决方案中直接引用当前项目。
实现方式:
a. 新建.net core 项目
b. 修改project.json文件,添加framework的版本,如:

c. 针对特定目标的代码,直接使用条件编译符号即可,这里是对应的目标版本对应关系,也是条件编译的变量名:
.NET Framework 2.0 --> net20
.NET Framework 3.0 --> net30
.NET Framework 3.5 --> net35
.NET Framework 4.0 --> net40
.NET Framework 4.5 --> net45
.NET Framework 4.5.1 --> net451
.NET Framework 4.5.2 --> net452
.NET Framework 4.6 --> net46
.NET Framework 4.6.1 --> net461
.NET Framework 4.6.2 --> net462
.NET Framework 4.6.3 --> net463
d. 编译生成即可,可以去debug文件夹下查看对应目标的dll
2. 使用标准库或者可移植类库,这个比较简单,只是vs2017才支持直接创建标准库项目,如果在2015中有需要可以先创建可移植项目,去属性页修改目标即可,如图:

以上是我个人对当前.Net体系下的理解,这里给出官方的完整平台图谱:

(转).Net基础体系和跨框架开发普及的更多相关文章
- .Net基础体系和跨框架开发普及
.net体系经过十几年发展,发生了很多变化.特别是在最近两年,随着开源和跨平台的发展,衍生出很多概念,像标准库,可移植库,.Net Core等,相信有不少同学对他们之间的关系是有一些困惑的,这里我从基 ...
- java EE技术体系——CLF平台API开发注意事项(4)——API生命周期治理简单说明
文档说明 截止日期:20170905,作者:何红霞,联系方式:QQ1028335395.邮箱:hehongxia626@163.com 综述 有幸加入到javaEE技术体系的研究与开发,也得益于大家的 ...
- 基于Typecho CMS框架开发大中型应用
基于Typecho CMS框架开发大中型应用 大中型应用暂且定义为:大于等于3个数据表的应用!汗吧! Typecho原本是一款博客系统,其框架体系有别于市面上一般意义MVC框架,主体代码以自创的Wid ...
- MVC WebAPI 三层分布式框架开发
版权声明:本文为博主原创文章,未经博主允许不得转载. 前言:SOA(面向服务的架构)是目前企业应用开发过程中普遍采用的技术,基于MVC WebAPI三层分布式框架开发,以此适用于企业信息系统的业务处理 ...
- 转载CSDN (MVC WebAPI 三层分布式框架开发)
前言:SOA(面向服务的架构)是目前企业应用开发过程中普遍采用的技术,基于MVC WebAPI三层分布式框架开发,以此适用于企业信息系统的业务处理,是本文论述的重点.此外,插件技术的应用,富客户端JQ ...
- C#_02.10_基础一_.NET框架
C#_02.10_基础一_.NET框架 一.概念: .NET框架是一个多语言组件开发和执行环境,它提供了一个跨语言的统一编程环境. 解读: 1..net框架是一个编程环境, 2.可以进行多语言的开发和 ...
- ThinkPHP5.0框架开发--第2章 TP5.0架构
ThinkPHP5.0框架开发--第2章 TP5.0架构 第2章 TP5.0架构 ================================================== 上次复习 1.如 ...
- 【FastDev4Android框架开发】RecyclerView完全解析之下拉刷新与上拉加载SwipeRefreshLayout(三十一)
转载请标明出处: http://blog.csdn.net/developer_jiangqq/article/details/49992269 本文出自:[江清清的博客] (一).前言: [好消息] ...
- Taro 3 正式版发布:开放式跨端跨框架解决方案
作者:凹凸曼 - yuche 从 Taro 第一个版本发布到现在,Taro 已经接受了来自于开源社区两年多的考验.今天我们很高兴地在党的生日发布 Taro 3(Taro Next)正式版,希望 Tar ...
随机推荐
- 负载均衡之DNS域名解析
转载请说明出处:http://blog.csdn.net/cywosp/article/details/38017027 在上一篇文章(http://blog.csdn.net/cywosp/arti ...
- 如何用VC编写供PB调用的DLL
和编写一般的DLL方法相同,需要注意以下两点: (1)调用约定 c函数有_stdcall._cdecl._fastcall等多种调用约定,调用约定用来说明函数参数的压栈顺序和由谁(函数自身还是调用者) ...
- 使用swagger作为restful api的doc文档生成——从源码中去提取restful URL接口描述文档
初衷 记得以前写接口,写完后会整理一份API接口文档,而文档的格式如果没有具体要求的话,最终展示的文档则完全决定于开发者的心情.也许多点,也许少点.甚至,接口总是需要适应新需求的,修改了,增加了,这份 ...
- JavaScript中url 传递参数(特殊字符)解决方法及转码解码的介绍
有些符号在URL中是不能直接传递的,如果要在URL中传递这些特殊符号,那么就要使用他们的编码了.下表中列出了一些URL特殊符号及编码 十六进制值 1. + URL 中+号表示空格 %2B 2. 空 ...
- UI-隐藏键盘
键盘的出现于隐藏(代码实现)================================= 1.通知案例: #import "ViewController.h" #import ...
- js的作用是临时修改 表单Action提交的地址,因为 又有新的动作需要把表单参数提交到 新的servlet中,这点很重要
JavaScript可以临时修稿 form表单的提交地址
- Spring核心AOP(面向切面编程)总结
(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/75208354冷血之心的博客) 1.AOP概念: 面向切面编程,指扩 ...
- linux 权限之所有者所属组
linux 如何改变文件属性与权限 我们知道档案权限对于一个系统的安全重要性,也知道档案的权限对于使用者与群组的相关性, 那如何修改一个档案的属性与权限呢? 我们这里介绍几个常用于群组.拥有者.各种身 ...
- mysql8之与标准sql的区别
一 mysql8概述 在研究mysql8新特性的时候,越来越感觉mysql8朝sql server看齐.看来对于中小型企业级应用也挺有兴趣,但是没有企业级的应用套件,有知道的麻烦告知.本文不探讨my ...
- [BZOJ5133][CodePlus2017年12月]白金元首与独舞
bzoj luogu 题意 给你一个\(n*m\)的网格,每个位置上有一个箭头指向上或下或左或右.有些位置上还没有箭头,现在要求你在这些没有箭头的位置上填入箭头,使得从网格的任意一个位置开始,都可以沿 ...