一、公共语言运行库

.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. 单点登录实现(spring session+redis完成session共享)

    一.前言 项目中用到的SSO,使用开源框架cas做的.简单的了解了一下cas,并学习了一下 单点登录的原理,有兴趣的同学也可以学习一下,写个demo玩一玩. 二.工程结构 我模拟了 sso的客户端和s ...

  2. SQL SERVER的统计信息

    1 什么是统计信息     统计信息 描述了 表格或者索引视图中的某些列的值 的分布情况,属于数据库对象.根据统计信息,查询优化器就能评估查询过程中需要读取的行数及结果集情况,同时也能创建高质量的查询 ...

  3. 2017-2-17 c#基础学习 (控制台程序的创建,输出,输入,定义变量,变量赋值,值覆盖,值拼接,值打印)

    1 控制台程序的创建 > 新建项目  ,选择 c#,  框架选择4.0 , 选择控制应用台程序, 选择文件保存位置 修改名字. 2 c#输出与输入 >在main函数中编写代码 >在编 ...

  4. intellij idea 常用快捷键mac版

    login.jsp文件中的html标签都是大写格式的,看着很不舒服,就改了一下,全部用的快捷键修改成小写的,也因此整理了一下常用的快捷键. shift + Command + u 大小写转换. alt ...

  5. .NET中利用反射来实现自动映射两个对象中的数据成员

    在以前的项目开发之中,经常会遇到这样一个问题:比如在外面项目的架构设计之中,我们采用MVC和EntityFramework来构建一个Web应用程序.比如我们采用常用的多层架构,例如有Presentat ...

  6. PHP链接Redis

    命令行下运行 redis-server.exe redis.windows.conf 此时,redis服务已经开启,然后我们可以再新开一个命令行,作为控制台 redis-cli.exe -h 127. ...

  7. How to create a repository in Github with Eclipse?

    How to create a repository in Github with Eclipse? Here is an answer. I will teach you how to do it ...

  8. rdb map出错rbd sysfs write failed

    创建了一个rbd镜像 $ rbd create --size 4096 docker_test 然后,在Ceph client端将该rbd镜像映射为本地设备时出错. $ rbd map docker_ ...

  9. 基于Asp.Net Core Mvc和EntityFramework Core 的实战入门教程系列-4

    来个目录吧: 第一章-入门 第二章- Entity Framework Core Nuget包管理 第三章-创建.修改.删除.查询 第四章-排序.过滤.分页.分组 第五章-迁移,EF Core 的co ...

  10. mybatis基础,mybatis配置文件核心组件typeHandler元素

    无论是从预处理语句中设置一个值,还是从结果集里取出一个值,都会用类型处理器将获取的值以合适的方式转换成 Java 类型 可以重写类型处理器或创建你自己的类型处理器来处理不支持的或非标准的类型 实现 o ...