.Net Framework .Net  .NET Standard的概念及区别

目录
  • .Net Framework .Net  .NET Standard的区别
    • 一、.NET Framework
    • 二、.Net
    • 三、.NET Standard
    • 三、实际操作说明

.Net Framework .Net  .NET Standard的区别

一、.NET Framework

在未来.NET Framework或许成为过去时,目前还是有很多地方在使用的。这一套体系对于做C#的老coder应该是再熟悉不过了,新入坑的也就用不着费力去学习。

.NET Framework 是一种技术,支持生成和运行 Windows 应用及 Web 服务。
.NET Framework 包括公共语言运行时 (CLR) 和 .NET Framework 类库。 公共语言运行时是 .NET Framework 的基础。
可将运行时看作一个在执行时管理代码的代理,它提供内存管理、线程管理和远程处理等核心服务,并且还强制实施严格的类型安全以及可提高安全性和可靠性的其他形式的代码准确性。

二、.Net

.net 就是由.net core 演进而来,在底层有很多性能和架构优化改造,上层应用api和用法和.NET Framework大多数相同。

.NET 是一种用于构建多种应用的免费开源开发平台,使用 .NET 时,无论你正在构建哪种类型的应用(web,api、桌面应用...),代码和项目文件看起来都一样。 可以访问每个应用的相同运行时、API 和语言功能。
NET 是开放源代码,使用 MIT 和 Apache 2 许可证。 .NET 是 .NET Foundation 的项目。
Microsoft 支持在 Windows、macOS 和 Linux 上使用 .NET。 它会定期更新以保证安全和质量。
.NET 支持三种编程语言:C#、F#、Visual Basic。

三、.NET Standard

.NET Standard 是针对多个 .NET 实现推出的一套正式的 .NET API 规范。 推出 .NET Standard 的背后动机是要提高 .NET 生态系统中的一致性。 但是,.NET 5 采用不同的方法来建立一致性,这种新方法在很多情况下都不需要 .NET Standard。

所以.net standard 是 .Net Api 规范,不是实现。其作用是为了提高.net 一致性,只要框架支持就能使用.net standard规范去实现。
但是!.NET 5 采用不同的方法来建立一致性,也就是说.net 5 开始过度到.net 框架如果你只是用于.net 框架的话,但是支持.net standard!(名字有点绕晕啊)
NET Standard并未弃用 对于可由多个 .NET 实现使用的库,仍需要 .NET Standard。比如在 .NET Framework 和 .NET 上都要使用的内库就需要按照.net standard规范,这样两个框架都能用,但是要看.net standard版本支持,下图对照。
在创建类库的时候就可以选择不同的支持框架。

各种 .NET 实现以特定版本的 .NET Standard 为目标。 每个 .NET 实现版本都会公布它所支持的最高 .NET Standard 版本,这种声明意味着它也支持以前的版本。

三、实际操作说明

1、创建一个.NET Standard 类库,添加一个简单的测试方法。

public class NetStandardTest
{
    public static void PrintLocation()
    {
        //打印FileStream 路径
        Console.WriteLine(typeof(FileStream).Assembly.Location);
        //打印NetStandardTest 路径
        Console.WriteLine(typeof(NetStandardTest).Assembly.Location);
    }
}

在这个测试方法里面我们加了两行打印代码。主要是打印FileStream路径,同时我们创建的.NET Standard类库为2.0,因为我们接下来要创建.net framework 的控制台,它不支持2.1。

2、创建.net 5,.net framework 4.6.1 控制台程序

创建好两个控制台项目,在主方法里面调用内库方法。

static void Main(string[] args)
{
    NetStandardTest.PrintLocation();

    Console.ReadKey();
}

解决方案结构如下

3、运行分析

从结果看我们看到同一个.NET Standard类库,引用在不同的框架上,调用同一个FileStream的地址是不一样的。
然后我们在.NET Standard类库里面F12定位到FileStream看到程序集如下

三个地址我们并列对比下:

C:\Program Files\dotnet\shared\Microsoft.NETCore.App\5.0.8\System.Private.CoreLib.dll
C:\Windows\Microsoft.NET\Framework\v4.0.30319\mscorlib.dll
C:\Users\Administrator\.nuget\packages\netstandard.library\2.0.3\build\netstandard2.0\ref\netstandard.dll

我们将三个dll 用dnspy反编译下,找到FileStream,随便找一个BeginRead方法看下代码。

  • .net standard

  • .net framework

  • .net 5

从上面三个结果对比可以看到.net standard里面是没有实现的,只是定义了方法,也就是说定义了一种标准,说明我的类里面有哪些东西。
调用的时候再根据我们当前使用的框架去找到对应框架的实现。这就是为什么.net standard能对多框架引用,也是为什么2.1不能被.net framework使用,因为它没有去实现2.1新增的api。
至于为什么我们调用.net standard的dll会被转到对应框架的dll呢,这是利用Type Forwarding方式实现跨程序集类型转移的技术成为“垫片(Shim)”,这是实现程序集跨平台复用的重要手段。
关于这个垫片技术可以看下这篇文章https://www.cnblogs.com/artech/p/how-to-cross-platform-03.html。

以上就是.Net Framework .Net  .NET Standard的概念及区别的详细内容,更多关于.Net Framework .Net  .NET Standard的区别的资料请关注我们其它相关文章!

(0)

相关推荐

  • Windows Server 2012 R2或2016无法安装.NET Framework 3.5.1的解决方法

    问题描述 使用 Windows Server 2012 R2 或 Windows Server 2016系统,发现在安装 .NET Framework 3.5.1 时报错,报错内容如下图所示. 原因分析 找不到安装源文件. 解决办法 您可以使用如下 PowerShell 脚本进行安装. 从 开始 菜单中找到 PowerShell,右键单击选择 以管理员身份运行. 输入如下脚本后,按回车键执行. Set-ItemProperty -Path 'HKLM:\SOFTWARE\Policies\Mic

  • Visual Studio 2017创建.net standard类库编译出错原因及解决方法

    正式版上个月已经Release了,从那时到现在经常会收到更新提示,估计问题还不少吧!其中最吸引我的当然是.net standard与.net core. 刚好最近接触.net standard项目,新建一个类库直接编译却出错!!立马心情不太好了,对它的兴趣大打折扣! 如果是新手估计立马就会吐槽了!作为老手还是静下心来看看原因. 看最后一项: 找不到资产文件"c:\users\newblifes\documents\visual studio 2017\Projects\TestDemo\Test

  • .NET Core/Framework如何创建委托大幅度提高反射调用的性能详解

    前言 大家都知道反射伤性能,但不得不反射的时候又怎么办呢?当真的被问题逼迫的时候还是能找到解决办法的. 反射是一种很重要的技术,然而它与直接调用相比性能要慢很多,因此如何优化反射性能也就成为一个不得不面对的问题. 目前最常见的优化反射性能的方法就是采用委托:用委托的方式调用需要反射调用的方法(或者属性.字段). 为反射得到的方法创建一个委托,此后调用此委托将能够提高近乎直接调用方法本身的性能.(当然 Emit 也能够帮助我们显著提升性能,不过直接得到可以调用的委托不是更加方便吗?) 性能对比数据

  • .NET framework 4.0 安装失败回滚问题

    根据微软论坛作者的英文解释,.NET framework 4.0 安装失败回滚貌似是因为"msvcr100_clr0400.dll"文件不能被覆盖的原因导致的,那么问题就简单了,我们只要把C盘下面的两个文件重命名就ok了. 具体文件路径如下(如果进入文件夹找不到对应的文件,可以进行查找): C:\Windows\System32\msvcr100_clr0400.dll -→ C:\Windows\System32\msvcr100_clr0400.dll.bak C:\Windows

  • 基于Jenkins搭建.NET FrameWork持续集成环境

    这里我们主要搭建 .Net 环境.本文是在 Windows 环境下安装的 Jenkins 进行操作 一.安装所需环境 这里我们需要安装以下安装包: .NET Framework 4.6.1https://www.microsoft.com/zh-cn/download/details.aspx?id=49982 MicrosoftBuild Tools 2015https://www.microsoft.com/zh-CN/download/details.aspx?id=48159 .NET

  • 简单了解.NET Framework

    一.CLR集成了很多种语言,他们之间可以互相访问,是因为CLR建立的标准的类型集.元数据.公共执行环境. 由于各种语言间存在着极大的差别,如区分大小写,有的不支持unsigned.操作符重载或者参数可变方法, 所以想要创建这种让别的语言能访问的程序,自己所用的编程语言只能使用其它语言都支持的那些特性. 为了帮助我们更好的做到这一点,Microsoft定义一个"公共语言规范(Common Language Specification,CLS)". 二.CTS定义了一组语言编译器必须遵循的

  • 安装.NET Framework进度条卡住不动的解决方案(推荐)

    VS在安装之前需要安装.NET Framework,我安装的是4.0版本.但是安装进度条到一半左右时就卡住不动了.前前后后重试多次,还有几次重新开机,但都没用. 开始还以为是安装的系统有问题.后来在网上求助,尝试几次之后终于找到了解决方案.这里记下来,方便以后使用.以下为主要的操作步骤: 1. 需要关闭系统的update服务:快捷键Win+R打开服务面板,输入"services.msc"打开服务管理,找到"Windows Update"选项, 右键点击"停

  • 基于.net standard 的动态编译实现代码

    在上篇文章[基于.net core 微服务的另类实现]结尾处,提到了如何方便自动的生成微服务的客户端代理,使对于调用方透明,同时将枯燥的东西使用框架集成,以提高使用便捷性.在尝试了基于 Emit 中间语言后,最终决定使用生成代码片段然后动态编译的模式实现. 1.背景: 其一在前文中,我们通过框架实现了微服务面向使用者的透明调用,但是需要为每个服务写一个客户端代理,显得异常繁琐,其二项目中前端站点使用了传统的.Net Framework 框架,后端微服务我们使用了.Net Core 框架改造,短时

  • .Net Framework .Net  .NET Standard的概念及区别

    目录 .Net Framework .Net  .NET Standard的区别 一..NET Framework 二..Net 三..NET Standard 三.实际操作说明 .Net Framework .Net  .NET Standard的区别 一..NET Framework 在未来.NET Framework或许成为过去时,目前还是有很多地方在使用的.这一套体系对于做C#的老coder应该是再熟悉不过了,新入坑的也就用不着费力去学习. .NET Framework 是一种技术,支持

  • Yii Framework框架中事件和行为的区别及应用实例分析

    本文实例讲述了Yii Framework框架中事件和行为的区别及应用.分享给大家供大家参考,具体如下: 个人觉得,在 Yii 里面,最难以明白的就是事件(Event)和行为(behavior)了.这不仅仅是因为它们的概念 比较难明,关键是它们的应用场景比较难明,不知道什么时候应该使用事件和行为来开发. 关于 Yii 的事件和行为的描述,可参考 http://www.yiiframework.com/doc/api/1.1/CComponent 本文参考的文章: http://www.larryu

  • 老生常谈之Java中堆和栈的概念和区别

    当一个人开始学习Java或者其他编程语言的时候,会接触到堆和栈,由于一开始没有明确清晰的说明解释,很多人会产生很多疑问,什么是堆,什么是栈,堆和栈有什么区别?更糟糕的是,Java中存在栈这样一个后进先出(Last In First Out)的顺序的数据结构,这就是java.util.Stack.这种情况下,不免让很多人更加费解前面的问题.事实上,堆和栈都是内存中的一部分,有着不同的作用,而且一个程序需要在这片区域上分配内存.众所周知,所有的Java程序都运行在JVM虚拟机内部,我们这里介绍的自然

  • IntelliJ IDEA中Project与Module的概念以及区别

    在 IntelliJ IDEA 中,没有类似于 Eclipse 工作空间(Workspace)的概念,而是提出了Project和Module这两个概念.接下来,就让我们一起看看 IntelliJ IDEA 官方是如何描述两者的吧! 对于 Project,IntelliJ IDEA 官方是这样介绍的: A project is a top-level organizational unit for your development work in IntelliJ IDEA. In its fin

  • Java中堆和栈的概念和区别

    当一个人开始学习Java或者其他编程语言的时候,会接触到堆和栈,由于一开始没有明确清晰的说明解释,很多人会产生很多疑问,什么是堆,什么是栈,堆和栈有什么区别?更糟糕的是,Java中存在栈这样一个后进先出(Last In First Out)的顺序的数据结构,这就是java.util.Stack.这种情况下,不免让很多人更加费解前面的问题.事实上,堆和栈都是内存中的一部分,有着不同的作用,而且一个程序需要在这片区域上分配内存.众所周知,所有的Java程序都运行在JVM虚拟机内部,我们这里介绍的自然

  • Entity Framework Core相关包的概念介绍与安装

    一.引言 我们以Entity Framework Core 最新版本3.1.1进行讲解,在正式的学习之前,我们第一步是要使用EF Core中的安装包,这时候需要明确的知道到底需要安装哪些包,我们下面先来讲解EF Core中需要使用到的一些包. 二.相关包极其概念 1.Microsoft.EntityFrameworkCore Microsoft.EntityFrameworkCore:Entity Framework Core is a lightweight and extensible ve

  • C/S和B/S两种架构的概念、区别和联系

    C/S和B/S,是再普通不过的两种软件架构方式,都可以进行同样的业务处理,甚至也可以用相同的方式实现共同的逻辑.既然如此,为何还要区分彼此呢?那我们就来看看二者的区别和联系. 一.C/S 架构 1. 概念 C/S 架构是一种典型的两层架构,其全程是Client/Server,即客户端服务器端架构,其客户端包含一个或多个在用户的电脑上运行的程序,而服务器端有两种,一种是数据库服务器端,客户端通过数据库连接访问服务器端的数据:另一种是Socket服务器端,服务器端的程序通过Socket与客户端的程序

  • 浅析php中抽象类和接口的概念以及区别

    复制代码 代码如下: //抽象类的定义:abstract class ku{  //定义一个抽象类  abstract function kx();  ......}function aa extends ku{  //实现抽象类的方法  function kx(){    echo 'sdsf';  }}//使用方法$aa=new aa;$aa->kx();//1.定义一些方法,子类必须完全实现这个抽象中所有的方法//2.不能从抽象类创建对象,它的意义在于被扩展//3.抽象类通常具有抽象方法,

  • Zend Framework 2.0事件管理器(The EventManager)入门教程

    概述 EventManger是一个为以下使用情况设计的组件: 复制代码 代码如下: 实现简单的主题/观察者模式 实现面向切面的设计 实现事件驱动的架构 基本的架构允许你添加和解除指定事件的侦听器,无论是在一个实例基础还是一个共享的集合:触发事件:终止侦听器的执行. 快速入门 通常,你将会在一个类中创建一个EventManager. 复制代码 代码如下: use Zend\EventManager\EventManagerInterface; use Zend\EventManager\Event

  • Java中StringUtils与CollectionUtils和ObjectUtil概念讲解

    目录 一.解析 概念 StringUtils概念 CollectionUtils概念 ObjectUtil概念 二.区别 三.总结 一.解析 概念 StringUtils概念 StringUtils 方法的操作对象是 Java.lang.String 类型的对象,是 JDK 提供的 String 类型操作方法的补充,并且是 null 安全的(即如果输入参数 String 为 null 则不会抛出 NullPointerException ,而是做了相应处理,例如,如果输入为 null 则返回也是

随机推荐