一、公共语言运行库

.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. 【2017年新篇章】 .NET 面试题汇总(二)

    本次给大家介绍的是我收集以及自己个人保存一些.NET面试题第二篇 第一篇文章请到这里:[2017年新篇章] .NET 面试题汇总(一) 简介 此次包含的不止是.NET知识,也包含少许前端知识以及.ne ...

  2. Jemter性能测试

    Jmeter 介绍 Jmeter  是一款使用Java开发的,开源免费的,测试工具, 主要用来做功能测试和性能测试(压力测试/负载测试). 而且用Jmeter 来测试 Restful API, 非常好 ...

  3. 解释 : translate 功能,过程

    本来预计是这样设计的 admin在增加内容时,如:添加新的地点或新的FAQ,这时需要有中文,马来文等,但是顾客通常是不会添加的,所以这部分就不给顾客添加或更改. 用户来到前台,先看看localstor ...

  4. select函数的用法

    首先介绍阻塞方式与非阻塞方式: 阻塞方式(block),就是进程或是线程执行到这些函数时必须等待某个事件的发生.如果事件没有发生,进程或线程就被阻塞,函数不能立即返回. 非阻塞方式(non-block ...

  5. 数据库基础——(SQLserver)约束

                                                              数据库定义:一些存储在硬盘上的数据文件 内存:计算机临时存储的一些数据 .net - ...

  6. HBase跨版本数据迁移总结

    某客户大数据测试场景为:Solr类似画像的数据查出用户标签--通过这些标签在HBase查询详细信息.以上测试功能以及性能. 其中HBase的数据量为500G,Solr约5T.数据均需要从对方的集群人工 ...

  7. Swashbuckle Swagger组件扩展

      用Swagger有一段时间, 我的model层是一个单独的dll 但给Swagger配置的是api层dll的XML. 所以就导致了model字段的注释不能够反应到参数说明. 所以我fork了一份 ...

  8. UIBeaierPath 与 CAShapeLayer

    CAShapeLayer是基于贝塞尔曲线而存在的, 如果没有贝塞尔曲线提供路径来画出图形, CAShapeLayer就没有存在的意义, CAShapeLayer可以使得不用在   drawRect:方 ...

  9. MyFirstServlet学习笔记

    MyFirstServlet学习笔记 项目文件的结构目录如下,ser包,下设Serv.java是一个servlet文件,Note只是做的笔记,webroot下有login.jsp,WEB-INF下有w ...

  10. ubuntu svn下载代码出错

    ubuntu svn下载代码出错: svn: OPTIONS of 'https://server.domain.local/svn/repo': SSL handshake failed: SSL ...