1、公共语言运行库git
.NET Framework 的核心是其运行库执行环境,称为Common Language Run,一般在CLR控制下运行的代码称为托管代码(由GC进行资源管理和回收),还有一部分是非托管代码包括的文件操做的句柄、对数据库资源进行访问的连接和网络连接,对非托管资源的管理有两种方法:github
1.声明一个析构函数,做为类的成员数据库
~MyClass() { //destrutor implementation }
2.在类中实现System.IDisposable编程
public void Dispose() { //implementation }
CLR执行编写好的源代码,须要编译源代码,.NET把编译分为两个阶段缓存
(1)将源代码编译为Microsoft的中间语言(IL)网络
(2)CLR把IL编译为平台专用的代码函数
IL能够快速的转换为本地机器码,而且老是即时编译的JIT,因此有:平台无关性、提升性能和语言的互操做性。工具
对于平台无关性:.NET对于Windows的支持已经造成了UWP对Microsoft产品的全面支持、用.Net Core更能够开发跨平台的Web应用程序、经过Xamarin中的工具和库也能够在移动设备上(iPhone和Andriod)使用C#。性能
对于提升性能:IL老是JIT编译的,JIT编译器确切地知道程序运行在什么类型的处理器上,能够利用该处理器提供的任何特性或特定的机器码来优化最后的可执行代码,目前X64和X86的CPU二者的主要却别是32位处理器上,须要用4个字节存储一个地址,而64位处理器上须要用8个字节存储一个地址。优化
对于语言的互操做性:如今支持.NET交互操做的主要有:VB.Net、Visual C++、Visual F#、COM和COM+、Windows运行库,Common Type System 通用类型系统和Common Language Specification 公共语言规范一块儿确保语言语言的互操做性
2、进程和应用程序域
在启动一个新的应用程序时,它会在一个进程环境内运行,Windows经过地址空间把进程分隔开来。这样,每一个进程有本身的虚拟内存来存储其数据和可执行代码,Windows利用额外的间接方式把这些虚拟的内存映射到物理内存或磁盘空间的一个特殊区域中,这样确保每一个进程相互独立,例如获取计算机正在运行的每一个进程列表,当有同名的进程时,把进程结束。
var processList = Process.GetProcesses().OrderBy(x => x.Id).ThenBy(x => x.ProcessName); foreach (var process in processList) { if (process.ProcessName.Equals("cmd")) process.Kill(); else Console.WriteLine("Process id is{0},Process name is {1}", process.Id, process.ProcessName); }
关闭的进程必定要是本身有权限,不然会报没法访问的错误。
Process类的详细信息能够参考Microsoft官方文档 http://msdn.microsoft.com/zh-cn/library/system.diagnostics.process.aspx
但使用.NET创建的可执行程序 *.exe,并无直接承载到进程当中,而是承载到应用AppDomain当中。应用程序域是.NET引入的一个新概念,它比进程所占用的资源要少,能够被看做是一个轻量级的进程。
在一个进程中能够包含多个应用程序域,一个应用程序域能够装载一个可执行程序(*.exe)或者多个程序集(*.dll)。这样可使应用程序域之间实现深度隔离,即便进程中的某个应用程序域出现错误,也不会影响其余应用程序域的正常运做。
当一个程序集同时被多个应用程序域调用时,会出现两种状况:
第一种状况:CLR分别为不一样的应用程序域加载此程序集。
第二种状况:CLR把此程序集加载到全部的应用程序域以外,并实现程序集共享,此状况比较特殊,被称做为Domain Neutral。
下面一个实列建立一个新的应用程序域,进行应用程序升级操做,当升级完成以后卸载这个应用程序域。
static void Main(string[] args) { var UpdateDomain = AppDomain.CreateDomain("UpdateMyApp"); //build the method when load assembly UpdateDomain.AssemblyLoad += (obj, e) => { Console.WriteLine("Update {0} App...", e.LoadedAssembly.GetName()); }; //build the method when unload assembly UpdateDomain.DomainUnload += (obj, e) => { Console.WriteLine("Update Finish"); }; ShowMessage()
var crossAppDomainDelegate = new CrossAppDomainDelegate(ShowMessage); UpdateDomain.ExecuteAssembly(@"D:\Visual Studio项目练习\PraticeCharter01\TestAppDomain\bin\Debug\TestAppDomain.exe"); UpdateDomain.DoCallBack(crossAppDomainDelegate); Console.WriteLine("Thread sleep 2s"); Thread.Sleep(2000); AppDomain.Unload(UpdateDomain); Console.WriteLine("Update Finish"); var a= Console.Read(); } public static void ShowMessage() { Console.WriteLine("Current Thread ID is:{0}\t AppDomain ID is:{1}\t AppDomain Name is:{2}", Thread.CurrentThread.ManagedThreadId, AppDomain.CurrentDomain.Id,AppDomain.CurrentDomain.FriendlyName); }
执行以后的结果是:
能够看出线程存在于进程当中,它在不一样的时刻能够运行于多个不一样的AppDomain当中。
在另外一个应用程序域中执行代码详细信息请参考:https://msdn.microsoft.com/zh-cn/library/ms173139(v=vs.110).aspx也能够试一下WPF应用程序域中调用另外一个WPF编译的应用程序。
3、程序集
Assembly是包含编译好的,面向.Net Framework的代码逻辑单元,程序集的一个重要特征是他们包含的元数据描述了对应代码中定义的类型和方法。程序集也包含描述程序集自己的元数据,这种程序集元数据包含在manifest区域中。
私有程序集通常附带在某个软件中,且只能用于该软件。
共享程序集放在文件系统的一个特定子目录中,称未全局程序集缓存GAC
4、.Net在编译和执行的过程:
本文主要参考C#高级编程第九版,以后会作一个关于本书的专栏,主要是结合本身的理解和编程实际对.NET有一个更深的认识。
专栏编写计划:无特殊状况前面1-31章会,会以每周两篇的量更新
31-47章会针对每种技术,以项目实例的方法进行更新,具体更新时间未定
全部源码地址:https://github.com/powfulCsharp/C-AdvancedProgramming
时间仓促,可能有些地方写得不对,但愿你们指正
推荐和点赞是对我最好的鼓励!!!