.netフレームワークの基本

ディレクトリ

1. .NETプラットフォーム、.NETフレームワークとは

2. .NETバージョン

3.CLR(共通言語ランタイム)

4.BCL(基本クラスライブラリ)

5.FCL(フレームワーククラスライブラリ)

3. .NETの操作メカニズム

6. .NETがプラットフォームに依存しない理由

7.用語

参照:


1. .NETプラットフォーム、.NETフレームワークとは

「プラットフォーム」(ここではソフトウェアテクノロジープラットフォームを指し、以下これを指します)は、独立して実行および独立して存在できることで、サポートする上位層のシステムとアプリケーションが依存する環境を提供します。それを抽出するために、プラットフォームは環境です。プラットフォームの仕様を満たすアプリケーションを投入して実行できる限り。

.Netには、Netプラットフォームと.Net FrameWorkフレームワークの2つの部分が含まれています。

1. Net FrameWorkフレームワークは.Netプラットフォームに含まれています。NetFrameWorkは、.Netプラットフォームの動作を保証するための環境とサポートを提供します。

2. .Net FrameWorkフレームワークは.Netプラットフォームの不可欠な部分であり、.Netプラットフォームで開発されたさまざまなアプリケーションが正常に動作できるようにするための安定した動作環境を提供します。(.Netプラットフォームは、インターネットアクセス、通信、およびゲーム用のチャイナモバイルインターネットプラットフォームに似ていますが、.Netフレームワークフレームワークは、チャイナモバイルインターネットプラットフォームが適切に機能できるようにするシグナルタワーに似ています。

3. C#は、.netプラットフォームに基づいて参照できるプログラミング言語です。そしてJavaは言語であり開発プラットフォームでもあります

4. .Netの開発とアプリケーション:Winform(デスクトップアプリケーション)、ASP.NET(インターネットアプリケーション)、WP8(携帯電話開発)、Unity3D(ゲーム開発または仮想現実)

5. 2つのインタラクティブモード:C / S(クライアント)/サーバーモード(サーバー)、B / S(ブラウザー)/サーバーモード(サーバー)

6.NETフレームワークは、CLR指向のプログラミングプラットフォームであり、システム仮想マシン(CLR)で実行され、CLRに基づいています。

7.NETの基本クラスライブラリは、他のさまざまな機能の基礎として、CLR(Javaの仮想マシンと同様)で実行されます。

8.NETフレームワークは、複数の言語(C#、F#、VB.NET、C ++、Pythonなど)の開発をサポートします。

2. .NETバージョン

C#バージョン .NETバージョン 発売日 特徴
C#1.0 .NET Framework 1.0 2002-02-13 委員会、イベント
C#1.1 .NET Framework 1.1 2003-04-24 APM(非同期プログラミングモデル)
C#2.0 .NET Framework 2.0 2005-11-07 ジェネリックス、無名メソッド、イテレーター、null許容型
C#3.0 .NET Framework 3.0 2007年11月6日 暗黙的なタイプ
  .NET Framework 3.5 2007-11-19 オブジェクトコレクションの初期化、属性の自動実装、匿名型、拡張メソッド、クエリ式、ラムダ式、式ツリー、部分クラスとメソッド、Linq
C#4.0 .NET Framework 4.0 2010-04-12 動的バインディング、ネーミングとオプションのパラメーター、一般的な共分散と反転、相互運用性
C#5.0 .NET Framework 4.5 2012-08-15 非同期および待機中(非同期および待機)、発信者情報(発信者情報)
C#6.0 .NET Framework 4.6 2015-07-20 C#6の新機能
  .NET Core 1.0 2016-06-27  
C#7.0 .NET Framework 4.6.2 2016-08-02 C#7.0の新機能
C#7.1 .NET Framework 4.7 2017-04-05  
  .NET Core 2.0 2016-08-14 .NET Core 2.0の新機能
C#7.2 .NET Framework 4.7.1 2017-10-17  
C#7.3 .NET Framework 4.7.2 2018-04-30  
  .NET Core 2.1 2018-05-30 .NET Core 2.1の新機能
  .NET Core 2.2 2018-12-04 .NET Core 2.2の新機能
C#8.0 .NET Framework 4.8 2019-04-18 C#8.0の新機能
  .NET Core 3.0 2019-09-23 .NET Core 3.0の新機能
  .NET Core 3.1 2019-12-03 .NET Core 3.1の新機能

.NET框架是开源的。它的代码在.NET Foundation - GitHub

3.CLR(公共语言运行时)

CLR是让程序执行所需的外部服务的集合,类似Java需要JVM虚拟机才可以运行。它的核心功能(比如即时编译,内存管理,程序集加载,安全性,异常处理和线程同步)可由面向CLR的所有语言使用。

CLR是.NET的运行基础,管理.NET程序集的执行。它运行于Windows之上,很多功能仅仅是Windows上的一个wrapper,例如线程,内存管理等,这些实际上是Windows在管理。但JIT则是它独有的,如果没有它,就不能把IL变成机器码,计算机也就不认识C#,你也就不能运行C#程序。

.NET下程序的运行

 在开始运行.NET程序之前,编译器将代码转换为IL。

  IL代码并不能直接运行,CLR将真正需要用到的程序集导入内存,读取元数据,接着为类型开辟内存空间,执行所有需要的安全检查,并最终运行代码:

  CLR找到代码中拥有Main方法的类型并且加载这个类型。CLR中一个名为Class loader(类加载程序)的组件负责这项工作。它会从GAC、配置文件、程序集元数据中寻找这个类型,然后将它的类型信息加载到内存中的数据结构中。在Class loader找到并加载完这个类型之后,它的类型信息会被缓存起来,这样就无需再次进行相同的过程。当然,如果这个类型引用了其他的类型,则会导致一连串的程序集加载,这将定义程序代码执行的环境(类似Java的JVM)。注意即使工程很大,有几百个程序集,CLR不会全部加载,只会在真正用到该程序集的时候才加载。

  验证。在CLR中,还存在一个验证程序(verifier),该验证程序的工作是在运行时确保代码是类型安全的。它主要校验两个方面,一个是元数据是正确的,一个是IL代码必须是类型安全的,类型的签名必须正确。这是早期绑定验证,验证在运行时之前发生。对于动态类型,此时不做任何检查。

  即时编译。(此时就从编译时过渡到了运行时)这一步就是将托管的IL代码编译为可以执行的机器代码的过程,由CLR的即时编译器(JIT Complier)完成。即时编译只有在方法的第一次调用时发生。类型加载程序(Class loader)会为每个方法插入一个存根。在调用方法时,CLR会检查方法的存根,如果存根为空,则执行JIT编译过程,并将该方法被编译后的本地机器代码地址写入到方法存根中。当第二次对同一方法进行调用时,会再次检查这个存根,如果发现其保存了本地机器代码的地址,则直接跳转到本地机器代码进行执行,无需再次进行JIT编译。JIT编译还会优化本地的代码。

在程序运行时,CLR还负责:

  异常处理

  内存管理与垃圾回收

  线程管理(线程池)

  托管代码是必须在CLR下执行的代码,而非托管代码则不需要CLR的支持就可以运行。CLR本身用于管理托管代码,因此它是由非托管代码编写的,并不是一个包含了托管代码的程序集,也不能使用IL DASM进行查看。

4.BCL(基础类库)

Base Class Library (BCL) 是微软所提出的一组标准库,可提供给.NET Framework所有语言使用。随着 Windows 以及.NET Framework 的成长,BCL 已近乎成为在.NET上的 Windows API。mscorlib.dll程序集几乎就是基础类库的代名词。基础类库中定义的类型称为基元类型,它也是为.NET框架所有的语言共享。

  当安装.NET Framework时,所有的基础类库被部署到全局程序集缓存(GAC)。它的位置一般在C:\Windows\assembly。所以你不需要在你的工程中手动引用任何的基础类库,它们会被自动引用。

  如果你从GAC中删除了mscorlib.dll,你的IDE将变成一个什么都不懂的白痴。因为没有mscorlib.dll,意味着没有基础类库,没有整型,字符串,控制台…你什么都做不了。

5.FCL(框架类库)

  作为一名.NET程序员,每天都要打交道的就是FCL了(框架类库)。BCL是FCL的一个子集。简单来说FCL除了BCL的那部分,就是我们要引用的外部参考。

3..NET的运行机制

所有.NET支持的语言编写出来的程序,在支持.NET的编译器编译之后,会先产出程序集,其主要内容是IL和元数据。之后,CLR调用JIT再将其翻译为机器码。

(1).NET程序被编译成什么形式的代码

  .net程序在第一次编译后,形成CLR头,元数据和中间代码。

  在实时运行或者部署时,进行第二次变异,编译的结果是在CLR中可以执行的机器代码;

  -CLR头包含了.net在运行该程序时得到的信息,包括程序集版本号,文件名和模块版本号。

  -MetaData包含了所有类型的定义,所有的引用以及程序集清单。

(2) JIT是如何工作的

  JIT引擎在编译中间代码之前,会寻找本机机器代码缓存并且确认是否可用:

  - 如果可以用,则直接加载;

  -  如果不可用,JIT引擎会查找类型中的方法存根,找到中间代码并且进行编译。

(3)简述程序集的加载机制

  CLR通过System.Reflection.Assembly.LoadFrom和System.Reflection.Assembly.Load来主动加载程序集:

  - 前者通过位置加载程序集;

  - 后者通过 唯一标识 强命名程序集 的四个元素来标识程序集;

  它们的加载方式一致,其内在策略是依次通过版本策略,CODEBASE位置,应用程序域位置和程序位置来查找程序(4)(4)什么是IL(CIL)?

        在.NET的开发过程中, IL的官方术语是MSIL或CIL(Common Intermediate Language,即公共中间语言)。因此,IL,MSIL       和CIL指的是同一种东西。

  当使用支持.NET的编译器编译之后,生成.dll或.exe文件。这文件称作.NET程序集,包含IL和元数据。不同语言(例如C#和   VB)经过不同编译器(例如C#编译器和VB编译器),编译一段功能相似的代码(区别仅仅在于语法),其IL也基本相似。虽然IL相对C#较为底层,但它仍然是一个十分高级的语言。它并不是汇编语言。

(5)什么是JIT?还有什么其他编译方式?何时使用到JIT?

 即时编译(英语:Just-in-time compilation)是动态编译的一种形式,是一种提高程序运行效率的方法。通常,程序有两种运行方式:静态编译与动态编译。静态编译的程序在执行前全部被翻译为机器码,而动态编译执行的则是一句句,边运行边翻译。

  即时编译则混合了这二者,一句句编译源代码,但是会将翻译过的代码缓存起来以降低性能损耗。相对于静态编译代码,即时编译的代码可以处理延迟绑定并增强安全性。

  CLR的JIT负责将IL编译成机器码。 当程序编译成程序集之后,CLR加载任何需要用到的其他程序集,并开始使用JIT将CIL编译为机器码。

  JIT编译器会在方法的首次调用时,从类型的元数据中查找方法,并进行检查,例如检查类型是否安全。如果出现了问题,则触发运行时错误。以后对方法的所有调用都以本地代码的形式全速运行,无须重新检查。

6.为什么说.NET是平台无关的

       .NET程序集可以在非微软操作系统如Mac OS,各种版本的Linux,以及iOS和Android移动设备上开发和执行。

  .NET的平台无关性主要体现为:.NET程序集可以在任何的平台上运行,不管是Windows,还是Mac,只要这个平台拥有将IL转换为机器码,以及加载其他相关程序集的能力(即CLR),而任何机器都可以运行机器码。

  这类似于Java的虚拟机,只要平台装了Java虚拟机,则这个平台就可以运行Java程序。

7.术语

1.CLR(公共语言运行时):类似java中jvm虚拟机,对.net很重要

2.BCL(基础类库)

3.FCL(框架类库)

4.CTS(公共类型系统

5.CLS(公共语言规范

参考:

https://www.cnblogs.com/makesense/p/6238160.html

https://www.cnblogs.com/makesense/p/6238160.html

https://www.cnblogs.com/joean/p/4716568.html

https://www.cnblogs.com/cuozhixu/p/5968920.html

发布了30 篇原创文章 · 获赞 1 · 访问量 1158

おすすめ

転載: blog.csdn.net/chunchunlaila/article/details/105299299
おすすめ