一、公共语言运行库

.NET Framework 的核心是其运行库执行环境,称为Common Language Run,通常在CLR控制下运行的代码称为托管代码(由GC进行资源管理和回收),还有一部分是非托管代码包括的文件操作的句柄、对数据库资源进行访问的链接和网络链接,对非托管资源的管理有两种方法:

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 公共语言规范一起确保语言语言的互操作性

二、进程和应用程序域

在启动一个新的应用程序时,它会在一个进程环境内运行,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(); 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编译的应用程序。

三、程序集

Assembly是包含编译好的,面向.Net Framework的代码逻辑单元,程序集的一个重要特征是他们包含的元数据描述了对应代码中定义的类型和方法。程序集也包含描述程序集本身的元数据,这种程序集元数据包含在manifest区域中。

私有程序集一般附带在某个软件中,且只能用于该软件。

共享程序集放在文件系统的一个特定子目录中,称未全局程序集缓存GAC

四、.Net在编译和执行的过程:

本文主要参考C#高级编程第九版,之后会做一个关于本书的专栏,主要是结合自己的理解和编程实际对.NET有一个更深的认识。

专栏编写计划:无特殊情况前面1-31章会,会以每周两篇的量更新

       31-47章会针对每种技术,以项目实例的方法进行更新,具体更新时间未定

       所有源码地址:https://github.com/powfulCsharp/C-AdvancedProgramming

时间仓促,可能有些地方写得不对,希望大家指正

推荐和点赞是对我最好的鼓励!!!

dotNet的体系结构介绍的更多相关文章

  1. 深入Java虚拟机读书笔记第一章Java体系结构介绍

    第1章 Java体系结构介绍 Java技术核心:Java虚拟机 Java:安全(先天防bug的设计.内存).健壮.平台无关.网络无关(底层结构上,对象序列化和RMI为分布式系统中各个部分共享对象提供了 ...

  2. _00017 Kafka的体系结构介绍以及Kafka入门案例(0基础案例+Java API的使用)

    博文作者:妳那伊抹微笑 itdog8 地址链接 : http://www.itdog8.com(个人链接) 博客地址:http://blog.csdn.net/u012185296 博文标题:_000 ...

  3. 【转贴】SMP、NUMA、MPP体系结构介绍

    SMP.NUMA.MPP体系结构介绍 https://www.cnblogs.com/tcicy/p/10185783.html 从系统架构来看,目前的商用服务器大体可以分为三类,即对称多处理器结构 ...

  4. DotNet Run 命令介绍

    前言 本篇主要介绍 asp.net core 中,使用 dotnet tools 运行 dotnet run 之后的系统执行过程. 如果你觉得对你有帮助的话,不妨点个[推荐]. 目录 dotnet r ...

  5. Hive体系结构介绍

    http://www.aboutyun.com/thread-6217-1-1.html   1.Hive架构与基本组成     下面是Hive的架构图. 图1.1 Hive体系结构     Hive ...

  6. Hive 体系结构介绍

    下面是Hive的架构图. 图1.1 Hive体系结构 Hive的体系结构可以分为以下几部分: (1)用户接口主要有三个:CLI,Client 和 WUI.其中最常用的是CLI,Cli启动的时候,会同时 ...

  7. NUMA体系结构介绍

    为什么会有NUMA? 在NUMA架构出现前,CPU欢快的朝着频率越来越高的方向发展.受到物理极限的挑战,又转为核数越来越多的方向发展.如果每个core的工作性质都是share-nothing(类似于m ...

  8. Oracle数据库基本操作(一) —— Oracle数据库体系结构介绍、DDL、DCL、DML

    一.Oracle数据库介绍 1.基本介绍 Oracle数据库系统是美国ORACLE公司(甲骨文)提供的以分布式数据库为核心的一组软件产品,是目前最流行的客户/服务器(CLIENT/SERVER)或B/ ...

  9. (1) 第一章 Java体系结构介绍

    1.网络带来的挑战和机遇 (1).挑战一: 网络包含的设备越来越广泛, 硬件体系不同, 操作系统不同,用途不同. java解决办法: 通过创建与平台无关的程序来解决这个问题.一个java程序可以不需要 ...

随机推荐

  1. 获取LayoutInflater对象的方法和inflate方法的一些参数问题

    一.获取LayoutInflater的三种方法 1. LayoutInflater layoutInflater = (LayoutInflater) MainActivity.this.getSys ...

  2. jquery及原生javascript对jsonp解决跨域问题实例详解

    jquery方式 前端: $.ajax({ url: 'http://m.xxx.tv/goLottery', data: { data: data }, type: 'GET', dataType: ...

  3. Java Web(十三) 使用javamail进行发送邮件,(使用QQ,163,新浪邮箱服务器)

    加油加油. --WH 一.发送邮件的原理 在了解其原理之前,先要知道两个协议,SMTP和POP3 SMTP:Simple Mail Transfer Protocol,即简单邮件传输协议,发送邮件的协 ...

  4. 【Zookeeper】源码分析之Leader选举(二)

    一.前言 前面学习了Leader选举的总体框架,接着来学习Zookeeper中默认的选举策略,FastLeaderElection. 二.FastLeaderElection源码分析 2.1 类的继承 ...

  5. python打印表格式数据,留出正确的空格和段落星号或注释

    python打印表格式数据,留出正确的空格,格式化打出 代码如下: def printPicnic(itemsDict,leftWidth,rightWidth): print('PICNIC ITE ...

  6. Web前端与移动开发学习路线图

    文章转载自「开发者圆桌」一个关于开发者入门.进阶.踩坑的微信公众号 这里整理的Web前端与移动开发学习路线图包含初中级两个部分,你可以通过百度云盘下载观看对应的视频 链接: http://pan.ba ...

  7. Gradle之恋-任务2

    由于任务作为Gradle的核心功能模块,多花点精力是值得的,本文继上一篇主要涉及到:任务的执行顺序.为任务添加组和描述.跳过任务.扩展任务属性.定义默认任务. 任务顺序 如果构建(build)不能在清 ...

  8. [vijosP1303]导弹拦截(最长上升子序列转LCS)

    描述 某国为了防御敌国的导弹袭击,研发出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的导弹来袭 ...

  9. ST HW3

    7. Use the following method printPrimes() for questions a-f below. /******************************** ...

  10. Solr commit 策略测试

    已知Solr 的Commit策略: 服务器端: 1)AutoCommit 2)AutoSoftCommit 客户端 Commit 本次我测试了客户端关闭Commit的情况下,服务器端Commit策略的 ...