.NET体系结构
主要内容包括:
C#与.NET的关系、公共语言运行库、中间语言、程序集、.NET Framework类、名称空间、内层管理...
C#与.NET的关系
C#是门高级编程语言,.NET(Framework)是个环境,用C#编写的所有代码总是在.NET Framework中运行。
CLR公共语言运行库
它是.NET Framework的核心,在CLR控制下运行的代码称为托管代码。CLR执行编写好的源代码之前,需要编译它。
编译分两个阶段:
1)将源代码编译为Microsoft中间语言(IL)
2)CLR把IL编译为平台专用代码。
这种设计的重要优点:
1)平台无关性,依托的是:CTS是通用类型系统,CLS是通用语言规范,
2)提高性能
3)语言的互操作性,COM、windows运行库
中间语言
应用程序域
就是为安全性,可靠性,隔离性,和版本控制,及卸载程序提供的隔离边界。它通常由运行库宿主创建,应用程序域提供了一个更安全,用途更广的处理单元。
程序集
程序集是.NET时代的动态链接库DLL,程序集是包含编译好的、面向.NET Framework的代码的逻辑单元。
程序集包括(中间语言(IL),元数据(metaData),资源(resource),装配清单(AL))。
它包含的元数据(描述自身的数据)描述了对应代码中定义的类型和方法。
可以编程访问这些元数据,这个技术称为“反射”。抽象工厂设计模式中有用到:
static string AssemblyName = Assembly.GetExecutingAssembly().GetName().Name; //获取程序集名称
string className = AssemblyName+".Models" + "." + db + "User"; //命名空间.类名称
(IUser)Assembly.Load(AssemblyName).CreateInstance(className); //获取IUser程序集
可执行代码和库代码,使用相同的程序集结构,他们的区别是:
可执行代码的程序集包含一个主程序的入口点,而库程序集不包含。
.NET Framework类
属于托管类,使用托管代码的好处是可以使用.NET基类库,非常多的类的集合。大部分.net基类库是用C#写的。
名称(命名)空间
是.NET避免类名冲突的一种方式。
Microsoft建议都至少要提供两个嵌套的命名空间名,第一个是公司名,第二个是技术名称或者软件包的名称,再之后是类名。
内存管理
1、GC(Garbage collector)
GC是垃圾收集器。CLR通过GC实现的自动内存管理。
1)什么被认为是可回收的对象?
GC采用一定的算法遍历所有的对象,找出可达对象和不可达对象,不可达对象是可回收的对象。
2)什么时候回收?
通常情况下:内存不足溢出时,确切的说,是第一代对象已满的时候。
3)如何回收?
垃圾收集进程来释放不可达对象的内存空间。
4)回收完后,还需要做什么?
避免托管堆上的内存碎片,重新分配内存,压缩托管堆。
5)避免垃圾回收带来的性能影响,采用代龄机制。
如要请求垃圾收集,可以调用下面的方法之一:
System.gc()
Runtime.getRuntime().gc()
2、托管资源vs非托管资源
资源就是程序中可利用的数据,譬如:字符串、图片和任何二进制数据,包括任何类型的文件。
托管资源是由CLR全权负责的资源,CLR不负责的资源为非托管资源。
对于托管资源通过GC自动清理回收。对于非托管资源,通过代码调用手动进行清除,再由GC回收。
如何正确的释放资源:对于非托管的资源,一般就是,Stream(流),数据库的连接,网络连接等的这些操作系统资源,需要我们手动去释放。
Net提供了三种释放方法:Dispose,Close,析构函数(也就是Finalize方法)
3、 托管内存与非托管内存之间的转换
c#有自己的内存回收机制,所以在c#中我们可以只new,不用关心怎样delete,c#使用gc来清理内存,这部分内存就是managed memory,大部分时候我们工作于c#环境中,都是在使用托管内存,然而c#毕竟运行在c++之上,有的时候,(比如可能我们需要引入一些第三方的c++或native代码的库,在Unity3d开发中很常见)我们需要直接在c#中操纵非托管的代码,这些non-managed memory我们就需要自己去处理他们的申请和释放了, c# 中提供了一些接口,完成托管和非托管之间的转换,以及对这部分内存的操作。
主要通过Marshal类和GCHandle类,编程时只要注意非托管的内存一定要负责好释放就可以了。
例如:Marshal.AllocHGlobal()
public static IntPtr AllocHGlobal(
int cb //内存中的所需字节数。
)
通过使用指定的字节数,从进程的非托管内存中分配内存。
返回值:指向新分配的内存的指针。 必须使用释放此内存 Marshal.FreeHGlobal 方法。
public static void FreeHGlobal(
IntPtr hglobal
)
IntPtr ptr = Marshal.AllocHGlobal(Marshal.SizeOf(cardCfg));
Marshal.StructureToPtr(cardCfg, ptr, false); InrPtr是个结构体:用于表示指针或句柄的平台特定类型。
FreeHGlobal()用法
//byte[]转换为Intptr
public static Intptr BytesToIntptr(byte[] bytes)
{
int size = bytes.Length;
IntPtr buffer = Marshal.AllocHGlobal(size);
try
{
Marshal.Copy(bytes, , buffer, size);
return buffer;
}
finally
{
Marshal.FreeHGlobal(buffer); //释放以前从进程的非托管内存中分配的内存。
}
}
.NET体系结构的更多相关文章
- 46张PPT讲述JVM体系结构、GC算法和调优
本PPT从JVM体系结构概述.GC算法.Hotspot内存管理.Hotspot垃圾回收器.调优和监控工具六大方面进行讲述.(内嵌iframe,建议使用电脑浏览) 好东西当然要分享,PPT已上传可供下载 ...
- SQL Server 索引和表体系结构(聚集索引)
聚集索引 概述 关于索引和表体系结构的概念一直都是讨论比较多的话题,其中表的各种存储形式是讨论的重点,在各个网站上面也有很多关于这方面写的不错的文章,我写这篇文章的目的也是为了将所有的知识点尽可能的组 ...
- Hadoop的体系结构
HDFS和MapReduce是Hadoop的两大核心.而整个Hadoop的体系结构主要是通过HDFS来实现对分布式存储的底层支持的,并且它会通过MapReduce来实现对分布式并行任务处理的程序支持. ...
- Oracle体系结构总结
1.Oracle 体系结构摘要图 2.Oracle 体系结构相关笔记 1.Oracle 体系结构摘要图 2.Oracle 体系结构相关笔记 可参考Oracle Architecture系列随堂笔记: ...
- Entity Framework 教程——EF体系结构
EF体系结构 下图是一张EF体系结构的全景图,让我们单独了解各个组件的用处. EDM (Entity Data Model): EDM由3个主要部分组成,概念模块(Conceptual Model), ...
- linux文件系统体系结构 和 虚拟文件系统(VFS)
图 1. Linux 文件系统组件的体系结构 用户空间包含一些应用程序(例如,文件系统的使用者)和 GNU C 库(glibc),它们为文件系统调用(打开.读取.写和关闭)提供用户接口.系统调用接口的 ...
- TFS API:一、TFS 体系结构和概念
TFS API:一.TFS 体系结构和概念 TFS是Team Fundation Server的简称,是微软VSTS的一部分,它是Microsoft应用程序生命周期管理(ALM)工具的核心协作平台, ...
- MySQL 体系结构
标签:MYSQL/数据库/查询原理/体系结构 概述 学习一门数据库系统首先得了解它的架构,明白它的架构原理对于后期的分析问题和性能调优都有很大的帮助,接下来就通过分析架构图来认识它. 目录 概述 架构 ...
- jQuery-1.9.1源码分析系列(十) 事件系统——事件体系结构
又是一个重磅功能点. 在分析源码之前分析一下体系结构,有助于源码理解.实际上在jQuery出现之前,Dean Edwards的跨浏览器AddEvent()设计做的已经比较优秀了:而且jQuery事件系 ...
- Android开发学习——android体系结构
Android的体系结构采用了分层架构的思想, 从上层到底层共包括四层,分别是应用程序程序层.应用框架层.系统库和Android运行时和Linux内核. 一 应用程序层 该层提供一些核心应用程序包,例 ...
随机推荐
- linux服务器同时运行两个或多个tomcat
第一步:条件:配置好jdk,如果没有配置好请看:https://www.cnblogs.com/weibanggang/p/11460537.html 第二步:下载安装tomcat 下载tomcat到 ...
- Java之路---Day11(接口)
2019-10-25-23:22:23 目录 1.接口的概念 2.接口的定义格式 3.接口包含的内容 4.接口的使用步骤 5.继承父类并实现多个接口 6.接口之间的多继承 接口的概念 接口是指对协定进 ...
- Stack布局中定位的方式
//……省略无关代码…… child: new Column( children: <Widget>[ new SizedBox(height: 20.0), new Stack( ali ...
- 小米手机安装Google框架
方法一 打开应用商店,搜索谷歌安装器下载即可. 方法二 搜索Gmail.Google+.Youtube等软件跳到豌豆荚,自动下载Google框架.
- 【转载】 C#中List集合使用OrderByDescending方法对集合进行倒序排序
在C#的List集合操作中,有时候需要针对List集合进行排序操作,如果是对List集合按照元素对象或者元素对象的某个属性进行倒序排序的话,可以使用OrderByDescending方法来实现,Ord ...
- hbuilder 热更新
记录下Hbuilder做热更新的功能. 首先是获取本地的版本与服务器的版本对比.服务器的版本大于本地的版本才进行更新.获取本地版本的方法 plus.runtime.getProperty(plus.r ...
- DataPipeline CTO 陈肃:我们花了3年时间,重新定义数据集成
目前,中国企业在大数据流通.交换.利用等方面仍处于起步阶段,但是企业应用数据集成市场却是庞大的.根据 Forrester 数据看来,2017 年全球数据应用集成市场纯软件规模是 320 亿美元,如果包 ...
- Hive架构分析
一.Hive三种设计模式 1.默认配置[使用Netty存储元数据] 2.mysql[使用mysql存储元数据] 3.配置Thrift[使用mysql存储元数据] 二.执行步骤 三.scala访问Hiv ...
- Deployment
Deployment RC是kubernetes中的一个核心概念,Deployment 是新一代的RC,除了拥有RC的功能外,还具备一下特性: 支持事件和状态查看:可以查看Deployment升级的状 ...
- Pods
Pods Pod概念 Pod是kubernetes集群应用中的创建和部署的最小.最简单的kubernetes对象模型单元的基本执行单元.Pod表示在集群中运行的进程. Pod 封装了应用程序的容器(一 ...