一、公共语言运行库

.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. MVC和三层架构

    从最开始写程序到现在,一路上听到架构这个词已经无数次了,在工作和圈子里也不停听到大家在讨论它,但是很多时候发现不少人对这个概念的理解都是很模糊的,无意间在知道上看到一个朋友的回答,感觉很不错,特转帖到 ...

  2. 来自高维的对抗 - 逆向TinyTool自制

    一.序 无论是逆向分析还是漏洞利用,我所理解的攻防博弈无非是二者在既定的某一阶段,以高维的方式进行对抗,并不断地升级维度.比如,逆向工程人员一般会选择在Root的环境下对App进行调试分析,其是以ro ...

  3. 利用自动类型转换存储string类型

    类型转换是我们最常用的功能.就像上战场用的枪一样,敌人用的冲锋枪, 自己手里就一把步枪,打起仗来始终有点不爽. 因此,基本功能的完善很重要. 通常情况下我们需要String类型转其它的基础类型.这时我 ...

  4. 利用jink的驱动软件j-flash 合并两个hex的方法,bootloader+app

    由于前几天要给工厂app和bootloader的hex的文件,网上很多都是bin的合并方法,bin的方法不再赘述,相信大家都能找到,现在将hex合并的方法写下来: 第一步:先打开第一个hex文件, 第 ...

  5. iOS 原生的 UIButton 点击事件是不允许带多参数的,唯一的一个参数就是默认UIButton本身 那么我们该怎么实现传递多个参数的点击事件呢?

    UIButton *btn = // create the button objc_setAssociatedObject(btn, "firstObject", someObje ...

  6. JS入门(三)

    数据的类型转换: 之前提到过,js中数据类型分两种, 基本数据类型string  number   boolean  undefined  null 复杂数据类型 对象   Date   Array ...

  7. JAVA面试题和答案(二)

    本文我们将要讨论Java面试中的各种不同类型的面试题,它们可以让雇主测试应聘者的Java和通用的面向对象编程的能力.下面的章节分为上下两篇,第一篇将要讨论面向对象编程和它的特点,关于Java和它的功能 ...

  8. Android -- 自定义ScrollView实现放大回弹效果

    1,刚刚在别人开源的项目中看到了一个挺不错的用户体验,效果图如下: 2,那下面我们就来实现一下,首先看一下布局,由于一般只是我们包含头像的那部分方法,所以这里我们要把布局分成两部分,对应的布局文件效果 ...

  9. IE浏览器下使用AJAX登陆接口请求缓存与登陆不了的问题解决

    问题: 在IE浏览器下面,登陆的时候老是登陆不上,但是打开控制台的时候再登陆却能登陆上. 分析: 通过抓包,发现,在不打开控制台的时候,少了一个接口的请求,却返回了改接口的返回信息,但是返回信息并不是 ...

  10. Yii2.0修改默认控制器

    设置默认控制器有两种方法 1.在/vendor/yiisoft/yii2/web/Application.PHP的第28行左右 public $defaultRoute = 'site';      ...