C#基础教程(一).NET框架

一、.NET

是由微软开发,一个致力于敏捷软件开发、快速应用开发、平台无关性和网络透明化的软件开发平台。.NET框架是以一种采用系统虚拟机运行的编程平台,以通用语言运行库(Common Language Runtime)为基础,支持多种语言(C#、VB.NET、C++、Python等)的开发。比如Python,可以借助微软提供的开源工具,即 IronPython,可以在C#中直接调用Python类库函数,Python会编译成CIL(又称MSIL,CL,以下就称CIL)

二、CLR

CLR即公共语言运行时(Common Language Runtime,简称CRL),就是微软为.net产品构建的运行环境,与java的JVM类似,通俗的讲就是.net虚拟机。CLR上实际运行的并不是我们通常所用的编程语言(例如C#、VB等),而是一种字节码形态的"中间语言"。这意味着只要能将代码编译成这种特定的"中间语言"(MSIL),任何语言的产品都能运行在CLR上。CLR通常被运行在Windows系统上,但是也有一些非Windows的版本。这意味着.Net也很容易实现"跨平台"。CLR是.net系列产品运行的基础。

三、托管代码/非托管代码与托管资源/非托管资源

定义:Common Intermediate Language,公共中间语言。

托管代码

托管代码是在公共语言运行库中运行的代码,托管代码的执行由公共语言运行库来直接控制,而不是操作系统来直接控制。具体而言,由公共语言运行库中的代码管理器来控制和执行托管代码,而公共语言运行库的其他部分会提供托管代码执行时所需要的各种服务,如垃圾回收、类型检查、安全支持等。托管代码不是源码,是CIL,遵守公共语言规则的语言都可以编译成CIL,比如C++,Phython,前提在微软特定工程和特定IDE,编译方法肯定与源语言没跨平台之前编译不同。

 

 

非托管代码

非托管代码是在托管代码的概念出现后相对于托管代码而言的,其实际上是计算机操纵系统可识别的机器码。非托管代码(机器码)的执行由操作系统来控制,其在执行时也需要各种服务,如垃圾回收、类型检查、安全支持等。由于没有像公共语言运行库这样的东西会自动给你提供服务,所以你需要自己提供这些服务,也就说你要写额外的代码来实现垃圾回收等功能。非托管代码比如在C#中直接调用c++dl,那么c++那部分直接编译成机器语言直接交给计算机系统去运作。

托管资源

  与托管代码密切相关的是托管资源。托管资源是由公共语言运行的垃圾回收器进行分配和释放的数据。默认情况下,C#、VisualBasic和JScript.NET数据是托管资源。不过,通过使用特殊的关键字,C#数据可以被标记为非托管资源。VisualC++数据在默认情况下是非托管数据,即使在使用/CLR开关时也不是托管的。

  关于托管资源,就不用说了,像简单的int,string,float,DateTime等等,.net中超过80%的资源都是托管资源。

非托管资源

  对于非托管资源,您在应用程序中使用完这些非托管资源之后,必须显示的释放他们,例如System.IO.StreamReader的一个文件对象,必须显示的调用对象的Close()方法关闭它,否则会占用系统的内存和资源,而且可能会出现意想不到的错误。

  最常见的一类非托管资源就是包装操作系统资源的对象,例如文件,窗口或网络连接,对于这类资源虽然垃圾回收器可以跟踪封装非托管资源的对象的生存期,但它不了解具体如何清理这些资源。还好.netFramework提供了Finalize()方法,它允许在垃圾回收器回收该类资源时,适当的清理非托管资源。如果在MSDNLibrary中搜索Finalize将会发现很多类似的主题,这里列举几种常见的非托管资源:ApplicationContext,Brush,Component,ComponentDesigner,Container,Context,Cursor,FileStream,Font,Icon,Image,Matrix,Object,OdbcDataReader,OleDBDataReader,Pen,Regex,Socket,StreamWriter,Timer,Tooltip等等资源。可能在使用的时候很多都没有注意到!

  在.NET中很多非托管资源在C#封装下实现了IDisposable接口,这个接口只有一个待实现的方法Dispose(),在上面提到的类中大都有这个方法,此外还有些类除了调用Dispose()方法可以释放资源之外,还可以调用Close()方法释放资源,比如各类数据库连接(Connection)、各种流(Stream),在调用Close()方法时会自动调用Dispose()方法的。

四、CLI

定义:Common Language Infrastructure公共语言基础结构,CLI是一组阐述了系统的架构、规则和约定的规范。

五、效率探讨:同一段代码测试托管代码和非托管代码效率的对比。 - 无常 - 博客园

结论:

       非托管C:4.609s;

        C++ CLR Console Aplication(代码是C拷贝):15.172s;

       C++内容用C#完成:62.453s

很显然,托管肯定没有不托管直接交互快。

六、CLI执行过程

到目前为止,源代码已经被编译成二进制的IL并且包含在程序集中,而且被CLR加载。但是,直接执行运算的CPU来说二进制的IL还是太高级了,而且不同的CPU支持的指令集也有所差异。因此,CLR在这里还需要对已经编译好的IL再次编译,针对CPU版本生成可以直接运行的CPU指令,这个过程是由JIT(Just In Time)编译器完成的,可以称作"即时编译"。

当第一次执行某个函数时,MSCorEE.dll 的JITCompiler函数会从程序集的元数据中获取该方法和方法的IL,并且分配一块内存地址,然后将IL编译成的本地代码放入这块内存,然后执行内存中的本地代码。

当再次执行这个函数的时候,由于内存中已经存在JIT编译好的本地代码,因此不需要再次进行JIT过程,可以直接执行内存中的本地代码。 可以预知的结果是,这种情况下应用程序启动后第一次调用某个模块所花费的时间要比以后调用这个模块要稍微多一些。

七、.NET 组成

.NET框架由三部分组成,编译工具+CLR+FCL(Framework Class Library)。

编译工具:IDE、.NET兼容的编译器(支持C#、VB.NET、F#、IronRuby和托管的C++)、调试器;

FCL是一个超类库,BCL(Base Class Library)也紧紧是它一个子集;

严格来说,编译工具不能算作.NET框架一部分的。
————————————————
版权声明:本文为CSDN博主「yangwenxue1989」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yangwenxue1989/article/details/123619318

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值