关于C#/.NET程序中的应用程序域程序集线程区域性的个人理解

Posted 文先生爱学习

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于C#/.NET程序中的应用程序域程序集线程区域性的个人理解相关的知识,希望对你有一定的参考价值。


1. 一张图:

关于C#/.NET程序中的应用程序域、程序集、线程、区域性的个人理解_应用程序

首先根据我通过微软文档的理解,如图所示的关系。其中程序集是可以共享给多个应用程序域的

在我们平常写程序的概念里面,直接是我们运行的程序代码了,这里叫模块,一个个模块就是一个个.cs文件生成的,

程序集可以理解为就是一个个dll文件或者exe文件,它把很多模块进行了管理,而一个进程多数时候肯定是有很多个dll文件+一个exe组成,所以这里引入了一个额外的概念叫应用程序域,它负责管理用到的程序集。


2. 第一个问题:为啥需要这些?

在大多数情况下,不必担心创建应用程序域和将程序集加载到这些域中,因为运行时主机会执行这些任务。

不过,如果要创建将托管公共语言运行时的应用程序、要创建以编程方式卸载的工具/代码或要创建可以动态卸载和重载的可插入组件,需要创建自己的应用程序域。 

其实就是,以上这个只是用于需要动态对某些代码进行加载到程序中或者卸载管理,才需要考虑创建自己的应用程序域

如果我们只是写业务逻辑的应用程序代码,确实是不用管这些的,因为它根本不会影响我们日常作为应用软件工程师的日常工作。

3. 第二个问题:应用程序域具体能提供什么功能

一般来说,操作系统中隔离资源的是进程,进程之间是不能直接进行调用对方代码的。而DotNet为一个DotNet进程提供了应用程序域,则使得,在一个进程内,应用程序域是可以互相隔离的,一个个应用程序域在同一个进程内,就如同一个个进程在一个操作系统里面。

因此,应用程序域至少可以提供如下功能:

  1. 在一个应用程序域中出现的错误不会影响其他应用程序域。
  2. ​能够在不停止整个进程的情况下停止单个应用程序。
  3. ​在一个应用程序中运行的代码不能直接访问其他应用程序中的代码或资源。 


4. 最后一个问题:应用程序域和线程、区域性有没有关系

线程是执行代码的操作系统构建,与应用程序域没有对应的关系。程序运行过程中,由一个或者多个线程执行。每个应用程序域可以执行多个线程,每个线程可以在多个应用程序域中执行。但在某一时刻,一个线程只能在一个程序域中执行,一个程序域中可以有0、1或者多个线程。通过  Thread.GetDomain  来获取当前线程所在应用程序域。

区域性,即CultureInfo类,是和线程关联的。可以通过 CultureInfo.CurrentCulture 和 Thread.CurrentCulture 两种之一进行获取。 这里特别要注意,如果通过 Thread.CurrentCulture 设定了区域性,则线程即使切换到其他应用程序域中执行,依然为该区域性,如果未通过 Thread.CurrentCulture进行设定,则由线程执行所在的应用程序域中的 CultureInfo.DefaultThreadCurrentCulture 属性的值确定。

以上是关于关于C#/.NET程序中的应用程序域程序集线程区域性的个人理解的主要内容,如果未能解决你的问题,请参考以下文章

C# 或 .NET 中的程序集到底是啥?

C#:进程线程应用程序域(AppDomain)与上下文分析

如何为 .NET 应用程序域重新加载程序集?

在中等信任的 ASP.Net 中读取程序集 Guid 而不锁定 appdomain 中的 DLL

如何切换 .NET 程序集以执行一种方法?

程序集反射加载和应用程序域冲突