当前位置:  开发笔记 > 后端 > 正文

我不懂Application Domain

如何解决《我不懂ApplicationDomain》经验,为你挑选了3个好方法。

.NET有这个应用域的概念,根据我的理解,它可用于将程序集加载到内存中.我已经对应用程序域做了一些研究,并且去了我当地的书店,了解了这个主题的一些额外知识,但它似乎非常稀少.

我所知道的我可以使用Application Domains来加载内存中的程序集,我可以在需要时卸载它们.

我提到的应用程序域的其他功能有哪些?线程是否尊重应用程序域边界?除了主要的应用程序域之外,在除了通信性能之外的不同应用程序域中加载程序集有什么缺点吗?

链接到讨论应用程序域的资源也很不错.我已经检查过MSDN,它没有那么多关于它们的信息.



1> JaredPar..:

AppDomains最佳可视化为一个非常轻量级的过程.

每个.Net流程可以有N个AppDomains,但一般来说只有一个.AppDomains的真正优势在于它们在您的流程中提供了隔离边界.对象只能通过远程处理或序列化在AppDomain边界上相互通信.

也可以在一个进程中以完全不同的安全级别运行2个AppDomain.这可以允许您在完全信任的情况下运行主应用程序,同时以低得多的信任级别运行不受信任的插件.

对于线程是否尊重AppDomain,很难说是或否.单个线程可能位于N个不同的AppDomain中.如果一个AppDomain中的对象对另一个AppDomain中的对象进行远程调用,则可能出现这种情况.该线程必须在AppDomains之间进行转换才能完成.

AppDomains的缺点主要是复杂性.远程处理可能需要一点时间来解决问题,正确设置AppDomain可能是一个非常重要的过程.

您可能想要查看AppDomains上的MSDN文档.很难找到描述它们的succint教程,因为它们具有各种复杂的功能.这提供了一个很好的概述,如果它没有直接回答你的问题,至少会指出你在正确的地方.

http://msdn.microsoft.com/en-us/library/cxk374d9.aspx

此文档不再维护,请参阅此更新版本:https: //msdn.microsoft.com/en-us/library/2bh4z9hs(v = vs.110).aspx


主要担心的是我不了解使用它们所获得的能力.我读到它们是一个轻量级的过程,但它们看起来不仅仅是那个,而且我可能会遗漏一些可能会在以后咬我的东西.IE我拿出的东西超过了我的需要.

2> Cheeso..:

JaredPar的答案很好,除了他没有注意到AppDomains 的存在理由 - 你只能通过卸载它的AppDomain来卸载程序集.如果您是一个长时间运行的操作系统进程,并且您希望必须加载然后以任何原因卸载程序集,那么您需要一个AppDomain.这里的典型示例是ASP.NET,它根据需要加载应用程序代码程序集,然后可以在以后不再使用应用程序时卸载它们.

您为卸载能力支付的成本是独立性 - 您需要跨AppDomain边界进行通信,无法进行简单的方法调用.您需要管理AppDomain生命周期.等等.

如果你只需要动态加载程序集和不认为你需要卸载它们单个进程的生命周期中,那么你可能并不需要运行多个应用程序域.这里的一个很好的例子可能是一个支持插件模型的丰富应用程序,它可以在"etc"目录中嗅出插件程序集并加载它们.但是,如果插件模型要求卸载插件......那么.

有一些特殊情况.比如,假设您想要同时加载2个不同版本的程序集.如果不将它们与AppDomains隔离,则可能会遇到陷阱.但那将是相当罕见的.

证明存在AppDomain的核心方案是必须能够卸载程序集的长时间运行的进程.

当然,当您要卸载程序集时,应用程序可能依赖于OS进程.换句话说,您可以运行3个或4个协作进程,每个进程都有自己的程序集,当您要卸载程序集时,只需关闭承载该程序集的进程即可.但AppDomain提供了更高性能的机制来实现这一点,而不需要进程停止/启动或跨进程通信,这比前面描述的跨AppDomain通信更重.我的意思是它仍然是遥控器,但它更慢,更多的上下文切换.


因为在计算机科学问题的答案中使用法语单词很有趣.
如果您觉得必须定义,为什么要使用单词?
@ BlueRaja-DannyPflughoeft它帮助教育那些可能不熟悉什么是常用术语的人,这些术语完美地包含了一个更加笨拙地用英语定义的想法.
@SamHolder链接的维基百科文章称英文翻译是"存在的理由".这对我来说似乎没有太笨拙的定义.
对于我的钱,这是最好的答案,因为据我所知,在MSDN的任何地方都没有明确说明"raison d'etre".

3> Jeroen Landh..:

您可以使用AppDomains执行的一些操作:

你可以关闭它而不会危及程序的稳定性.

您可以加载代码并为您提供比自己的进程更少的权限(例如,您的进程完全受信任,但您在单独的AppDomain中加载代码,甚至无法在磁盘上创建文件.)

您可以处理AppDomain的未处理异常,而不必崩溃您的进程.

等等.

简而言之,它是一个安全边界,而且只是一个过程边界.就性能而言,进程中的多个AppDomain并不代表显着的开销.启动单独的进程而不是AppDomain的成本要高得多.

推荐阅读
夏晶阳--艺术
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有