一、公共语言运行库

.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. could not resolve host: github.com 问题解决办法

    向github提交代码时出现问题,如图: 代码push失败,提示could not resolve host: github.com     解决办法:   1.打开终端,输入:ping github ...

  2. 【转】jqGrid学习之安装

    jqGrid安装很简单,只需把相应的css.js文件加入到页面中即可. 按照官网文档: /myproject/css/             ui.jqgrid.css             /u ...

  3. 康复计划#5 Matrix-Tree定理(生成树计数)的另类证明和简单拓展

    本篇口胡写给我自己这样的什么都乱证一通的口胡选手 以及那些刚学Matrix-Tree,大致理解了常见的证明但还想看看有什么简单拓展的人- 大概讲一下我自己对Matrix-Tree定理的一些理解.常见版 ...

  4. 第21篇 js四种继承方式

    js是一个很自由的语言,没有强类型的语言的那种限制,实现一个功能往往有很多做法.继承就是其中的一个,在js中继承大概可以分为四大类,上面一篇文章也提及过一些,下面开始详细说说js的继承. 1.原型继承 ...

  5. CSS中padding和margin以及用法

    CSS中padding与margin 1.padding:内边距,表示控件内容相对于边缘的距离. 2.margin:外边距,表示控件边缘相对于父空间的边缘. 参考:http://www.studyof ...

  6. HTML入门第二天

    一. URL url:统一资源定位符 组成: 协议://域名:端口号/文件?参数名1=值1&参数名2=值2 例子:http://www.163.com:80/index.html?userna ...

  7. PHP测试题讲解(20161027)

    注: 关联数组 关联数组,它的每个 ID 键都关联一个值.在存储有关具体命名的值的数据时,使用数值数组不是最好的做法.通过关联数组,我们可以把值作为键,并向它们赋值. 例子 1 在本例中,我们使用一个 ...

  8. 关于easyUI的datebox加失去焦点事件即click、blur等

    想实现日期框easyui-datebox手动输入值,手动输入失去焦点判断输入值是否合法 例如<input id="txtDate" type="text" ...

  9. java内部发送http请求并取得返回结果,修改response的cookie

    public Object userLogin(HttpServletRequest request, HttpServletResponse response, String email, Stri ...

  10. Map集合概述和特点

    A:Map集合概述和特点(Set底层依赖的是Map) 将键映射到值的对象 一个映射不能包含重复的键 每个键最多只能映射到一个值 B:Map接口和Collection接口的不同 Map是双列的(是双列集 ...