`

应用程序域(AppDomain)

 
阅读更多

1、进行错误隔离和安全设置隔离,一个应用程序域如果崩溃不会影响其他应用程序域,功能类似于操作系统的进程
2、在.NET环境下才产生,因为它在CLR中运行
3、应用程序域的创建和销毁所需的开销相对于系统进程小,一个进程中可以包含多个应用程序域

  • 在理解应用程序域之前,先了解一下进程的作用,其实应用程序域的作用就相当于进程的作用;

其实,进程就是操作系统用来隔离各个不同应用程序的机制。

  • 在.net之前,应用程序被加载到进程中,可以有多个应用程序共享一个进程,但是这样一旦一个应用程序出错就会导致整个进程崩溃;系统为每个进程分配了虚拟内存(进程不能直接访问物理量内存)

,这样就决定了一个进程是无法访问另一个进程的内存的,自然加载在进程的应用程序也就不能访问另一个应用程序

	的内存了,所以,进程就作为应用程序之间的一个边界而存在着,从而提高了应用程序的安全性,因为这样,当某个
	应用程序出错了就不会影响到其他的应用程序了。

  • 既然有了进程能够维持这样的应用程序的安全性,为何还要有应用程序域呢?原因就是进程的性能低(为什么说会对性能有很大影响呢?原因是当多个进程需要相互通信的时候,由于进程间是无法共享内存的,所以就必须在进程之间通过复杂的数据复制,这样对性能就有很大的影响了),在真实的 应用场景中,不可避免的要由进程之间的相互通信,但是进程之间又是无法共享内存的,也就是进程之间是无法 相互调用的,这就引出了应用程序域了。
  • 应用程序域是为了减少系统开销的前提下达到应用程序安全。一个进程中可以有多个应用程序域,一个应用程序域对应一个应用程序;应用程序域也是相当于进程一样的一个

应用程序的边界,但是他对性能的开销比进程低;运行在同一个进程的应用程序是可以共享数据和相互通信的,

	虽然也是不能直接的调用,但是可以通过复制对象或者代理的方式来实现相互的通信。

  • 当一个进程被创建的时候系统会默认为该进程生成一个默认应用程序域,该域是无法被卸载的,只有当进程结束了

该域才被销毁,所以如果把程序集或类加载在默认的应用程序域的话,一旦出错了,就会导致进程崩溃。

	所以建议自己创建应用程序域,创建应用程序域的步骤:
	AppDomainSetup setup=new AppDomain();
	setup.LoaderOptimization=LoaderOptimization.SingleDomain;//这种表明该域中的程序集是无法共享的
	AppDomain domain=AppDomain.CreateDomain("Name",NULL,setup);
	......
	......//应用程序运行的代码;
	domain.Unload();

  • 一个应用程序要运行就必须有一个进程,进程中就必须有一个应用程序域,所以,首先得先把该应用程序的程序集

加载到域中,可以通过Assembly.Load();或者LoadFrom()来加载到域中。

 

分享到:
评论

相关推荐

    Http请求处理流程.doc

    1. 从HTTP.SYS中获取当前的Httq请求信息,并且将这些信息保存到 HttpWorkerRequest 类中。 2. 在相互隔离的应用程序域AppDomain中加载HttpRuntime。 3. 调用 HttpRuntime的ProcessRequest方法。

    C#综合细说进程、应用程序域与上下文

    本文主要是介绍进程(Process)、应用程序域(AppDomain)、.NET上下文(Context)的概念与操作。虽然在一般的开发当中这三者并不常用,但熟悉三者的关系,深入了解其作用,对提高系统的性能有莫大的帮助。在本篇...

    AppDomain编程

    关于AppDomain编程的全面资料,适合中高级技术人员阅读

    多线程学习文档

    应用程序域(AppDomain)是一个程序运行的逻辑区域,它可以视为一个轻量级的进程,.NET的程序集正是在应用程序域中运行的,一个进程可以包含有多个应用程序域,一个应用程序域也可以包含多个程序集。在一个应用程序...

    c#取得控制台应用程序根目录

    1、取得控制台应用程序的根目录方法 ...//获取承载在当前应用程序域中的应用程序的应用程序目录的物理驱动器路径。用于App_Data中获取方法2、Server.MapPath(“”) 或者 Server.MapPath(“~/”);//返回与W

    使用AppDomain加载和卸载程序集的细微差别

    考虑使用可热插拔模块编写应用程序时应了解的事项。

    C#强化系列文章(共九篇)

    C#强化系列文章六:应用程序域(AppDomain)浅析.doc C#强化系列文章七:序列化和反序列化.doc C#强化系列文章八:HttpModule,HttpHandler,HttpHandlerFactory简单使用.doc C#强化系列文章九:代码访问安全性使用....

    CLR via C# 中文版 第三版(part1)

     第四部分,核心设施(Core Facilities),包括异常与状态管理,自动内存管理(垃圾收集),CLR托管与应用程序域(AppDomain),程序集加载与反射,运行时序列化等。    第五部分,线程(Threading),这是第三...

    CLR via C# 中文版 第三版(part2)

     第四部分,核心设施(Core Facilities),包括异常与状态管理,自动内存管理(垃圾收集),CLR托管与应用程序域(AppDomain),程序集加载与反射,运行时序列化等。    第五部分,线程(Threading),这是第三...

    .NET中获取程序根目录的常用方法介绍

    1、取得控制台应用程序的根目录方法 方法1、...//获取承载在当前应用程序域中的应用程序的应用程序目录的物理驱动器路径。用于App_Data中获取 方法2、Server.MapPath(“”) 或者 Server.MapPath(“~/”);//返回

    微软操作系统进程管理神器

    显示运行.NET应用的进程,以及与.NET相关的细节(比如应用域(AppDomain〕的列表、已加载的程序集和CLR性能计数器)。 显示进程和线程的启动时间。 显示内存映射文件(不仅仅包括DLL)的完整列表。 能够挂起进程...

    appdomain:从https移走

    appdomain项目是一个命令行应用程序,演示了如何使用ambit -model程序包。 或者,可在Ambit Discovery桌面应用程序以及Ambit Web应用程序中的REST Web服务中实现适用性域算法。 仅基于训练集中的数据(与模型无关...

    简单的动态调用dll及 dll的释放

    简单的动态调用dll及 dll的释放,运用了AppDomain——应用程序域

    asp.net编程获取项目根目录实现方法集合

    本文实例总结了asp.net编程获取项目根目录实现方法。分享给大家供大家参考,具体如下: 编写程序的时候,经常需要用的项目根目录。自己总结如下 ...//获取承载在当前应用程序域中的应用程序的应用程序目录的物

    CrossAppDomainWCF:这只是关于通过 WCF 和 NamedPipes 进行跨 AppDomain 通信的概念验证

    跨应用域WCF 这只是关于通过 WCF 和 NamedPipes 进行跨 AppDomain 通信的概念验证。 主要项目是 PoC.AppDomainWCF.App,它承载 WCF 服务并包含 Manager 类以创建新的 AppDomains 并将程序集加载到其中。 PoC....

    CLR via C# 中文版 第三版(高清_全_part1.rar)

     第四部分,核心设施(Core Facilities),包括异常与状态管理,自动内存管理(垃圾收集),CLR托管与应用程序域(AppDomain),程序集加载与反射,运行时序列化等。    第五部分,线程(Threading),这是第三...

    .Net开源线程池组件SmartThreadPool.zip

    默认的线程池与应用程序域 (AppDomain)挂钩,一个AppDomain只有一个线程池。假如在线程池中执行了一个周期较长的任务,一直占用着其中一个线程,可能就会影响到 应用程序域中的其他程序的性能。例如,假如在Asp.Net...

    CLR via C# 中文版 第三版(高清_全_part2.rar)

     第四部分,核心设施(Core Facilities),包括异常与状态管理,自动内存管理(垃圾收集),CLR托管与应用程序域(AppDomain),程序集加载与反射,运行时序列化等。    第五部分,线程(Threading),这是第三...

    ServiceStack.Text.TupleSerializer:ServiceStack.Text的扩展,以将Tuple序列化为定界字符串

    例子主机配置在ExampleCode命名空间中为当前应用程序域中的所有程序集配置所有元组: new TupleSerializerConfigurator () . WithAssemblies ( AppDomain . CurrentDomain . GetAssemblies ()) . ...

Global site tag (gtag.js) - Google Analytics