.Net基础体系和跨框架开发普及

 .net体系经过十几年发展,发生了很多变化。特别是在最近两年,随着开源和跨平台的发展,衍生出很多概念,像标准库,可移植库,.Net Core等,相信有不少同学对他们之间的关系是有一些困惑的,这里我从基础概念,跨框架开发的注意事项等,对.net的平台和相关概念做一个普及分享。此分享是从个人的知识体系中总结,如有不足,欢迎勘误!

一. 基础概念

  .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体系下的理解,这里给出官方的完整平台图谱:

 

下篇文章我将实战演示OSS.Common项目的迁移过程,如果你有兴趣,可以添加公众号(osscoder):

原文地址:http://www.cnblogs.com/sunhoy/p/6371178.html


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

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

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

相关文章

使用Servlet上传多张图片——Service层(ProductInfoService.java和ProductInfoServiceImpl)

package orz.treeSquirrels.service;import orz.treeSquirrels.entity.ProductInfo;/*** 商品信息表的业务逻辑类接口* author Administrator**/ public interface ProductInfoService {/*** * Title: addProductInfo* Description: 添加商品信息* param param pro* param retu…

‘1‘ VS 1

‘1’-481; 把字符转换为数字,利用ASCALL表

一次恐怖的 Java 内存泄漏排查实战

转载自 一次恐怖的 Java 内存泄漏排查实战 最近在看《深入理解Java虚拟机:JVM高级特性与最佳实践》(第二版)这本书,理论实践结合,深入浅出,强烈推荐给大家。 这两天对JVM内容进行了一个讨论,…

肯德基app电脑端自动下单程序

肯德基app电脑端自动下单程序_百度搜索 定制款肯德基APP电脑端自动下单软件程序 - 软件开发 - 天盟网-国内领先的IT技术需求服务平台_创新型软件众包服务接单网_知识技能服务威客网 https://qz-m.oaqhsgl.cn/kfc/set/city?type1&sourcehttps%3A%2F%2Fqz-m.oaqhsgl.cn%2Fkf…

ASP.NET与ASP.NET Core用户验证Cookie并存解决方案

在你将现有的用户登录(Sign In)站点从ASP.NET迁移至ASP.NET Core时,你将面临这样一个问题——如何让ASP.NET与ASP.NET Core用户验证Cookie并存,让ASP.NET应用与ASP.NET Core应用分别使用各自的Cookie?因为ASP.NET用的是…

vue学习2

P1 01_Vue学习目标03:50 P2 02_前端知识体系16:27 P3 03_前后端分离的演变史17:13 P4 04_前端MVVM模式09:31 P5 05_Vue是什么07:23 P6 06_第一个Vue应用程序07:06 P7 07_Vue实例声明周期05:35 P8 08_条件渲染06:59 P9 09_列表渲染03:34 P10 10_事件处理03:44…

一道非常棘手的 Java 面试题:i++ 是线程安全的吗

转载自 一道非常棘手的 Java 面试题:i 是线程安全的吗 i 是线程安全的吗? 相信很多中高级的 Java 面试者都遇到过这个问题,很多对这个不是很清楚的肯定是一脸蒙逼。内心肯定还在质疑,i 居然还有线程安全问题?只能说…

Microsoft规划了.NET的未来发展

Microsoft的Mads Torgersen分享了.NET语言家族的更新策略,给出了对公司未来的功能考虑的深刻理解。虽然C#、VB.NET和F#的开发是通过GitHub公开进行的,但是Microsoft的长远规划却经常是保密的。公众如果对Microsoft目前思考问题的方式有相关的意见和建议的…

逆波兰计算器实现

逆波兰计算器 思路分析 代码实现 package com.atguigu.stack;import java.security.AlgorithmConstraints; import java.util.ArrayList; import java.util.List; import java.util.Stack;/*** 创建人 wdl* 创建时间 2021/3/20* 描述*/ public class PolandNotation {public …

Python MySQL 插入表

Python MySQL 插入表 - 吴吃辣 - 博客园 Python MySQL 插入表 章节 Python MySQL 入门Python MySQL 创建数据库Python MySQL 创建表Python MySQL 插入表Python MySQL SelectPython MySQL WherePython MySQL Order ByPython MySQL DeletePython MySQL 删除表Python MySQL Updat…

jQuery API 中文文档

转载自 jQuery API 中文文档 Ajax 全局 Ajax 事件处理器辅助函数底层接口快捷方法DOM 属性回调对象核心 APICSS数据操作延迟对象弃用 1.3 版本弃用的 API1.4 版本弃用的 API1.7 版本弃用的 API1.8 版本弃用的 API1.9 版本弃用的 API1.10 版本弃用的 API3.0 版本弃用的 API尺寸…

2017济南北大青鸟accp和学士后课程的真实情况

我给大家说说2017年济南北大青鸟培训中心关于accp课程和学士后6.0的课程内容和教学方式的真实教学情况,别的青鸟中心是不是这样我不清楚。  首先是accp课程:面向高中起点,学期1年半,共三个学期,每个学期分别交学费;其次是学士后…

逆波兰表达式中缀表达式转换为后缀表达式

中缀表达式转换为后缀表达式 思路分析 代码实现 package com.atguigu.stack;import javax.swing.plaf.nimbus.State; import java.security.AlgorithmConstraints; import java.util.ArrayList; import java.util.List; import java.util.Stack;/*** 创建人 wdl* 创建时间 20…

OSS.Common扩展.Net Standard支持实例分享

上篇(.Net基础体系和跨框架开发普及)介绍了.Net当前生态下的大概情况,也分享了简单实现的过程,这篇文章就是讲解我的OSS.Common项目扩展.Net Standard 支持的过程,主要集中在:方案的选择,移植检…

A configuration error occurred during startup.Please verify the preference field with the prompt: To

今天遇到了一个棘手的问题,到现在都没有解决,折腾了一天结果捣鼓出来个更棘手的问题,经过多方继续折腾,终于把后来的这个问题给搞定了,但是前面的问题还是没有解决。有遇到相类似的问题解决了的麻烦分享一下&#xff0…

mysql根据注释搜索表

Select table_name 表名,TABLE_COMMENT 表注解 from INFORMATION_SCHEMA.TABLES Where table_schema dbname AND TABLE_COMMENT LIKE %人口%;Select table_name 表名,TABLE_COMMENT 表注解 from INFORMATION_SCHEMA.TABLES Where table_schema dbname AND table_name LIKE %i…

jQuery中position()与offset()区别

转载自 jQuery中position()与offset()区别 position()获取相对于它最近的具有相对位置(position:relative或position:absolute)的父级元素的距离,如果找不到这样的元素,则返回相对于浏览器的距离。 offset()始终返回相对于浏览器文档document的距离&a…

150. 逆波兰表达式求值---JAVA---LeetCode

class Solution {public int evalRPN(String[] tokens) {//创建一个栈&#xff0c;只需要一个栈即可Stack<Integer> stack new Stack<>();//遍历 lsfor(String item:tokens){//这里使用正则表达式来取出数if(isNumber(item)){//匹配的是多位数//入栈stack.push(In…

look look C#7

vs2017也rc好几个版本了&#xff0c;本想跟进看看c#7加入了什么内容&#xff0c;去搜索c#7&#xff0c;确实找到了不少文章&#xff0c;无奈很多特性ide根本不让编译啊。。。所以今天主要列出已经确定了的c#7特性&#xff08;一般来说rc后也不会加入新的特性了&#xff0c;其它…