.net 我不知道';我不了解应用程序域

.net 我不知道';我不了解应用程序域,.net,appdomain,.net,Appdomain,.NET具有应用程序域的概念,据我所知,应用程序域可用于将程序集加载到内存中。我对应用领域做了一些研究,也去了当地的书店了解了一些关于这个主题的额外知识,但似乎非常缺乏 我所知道的应用程序域所能做的就是在内存中加载程序集,并在需要时卸载它们 我提到的应用程序域的其他功能是什么?线程是否尊重应用程序域边界?除了通信性能之外,在主应用程序域之外的不同应用程序域中加载程序集是否存在任何缺点? 链接到讨论应用程序域的资源也不错。我已经查看了MSDN,它没有那么多关于它们的信息。AppDomains最好是

.NET具有应用程序域的概念,据我所知,应用程序域可用于将程序集加载到内存中。我对应用领域做了一些研究,也去了当地的书店了解了一些关于这个主题的额外知识,但似乎非常缺乏

我所知道的应用程序域所能做的就是在内存中加载程序集,并在需要时卸载它们

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


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

AppDomains最好是作为一个非常轻量级的过程来可视化

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

还可以在一个进程中以完全不同的安全级别运行2个AppDomain。这可以让您以完全信任的方式运行主应用程序,同时以更低的信任级别运行不受信任的插件

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

AppDomains的缺点主要是复杂性。远程处理可能需要一点时间来让您的头脑清醒过来,正确设置AppDomain可能是一个非常重要的过程

您可能想浏览一下AppDomains上的MSDN文档。很难找到一个简洁的教程来描述它们,因为它们有各种复杂的特性。这提供了一个很好的概述,如果它不能直接回答您的问题,至少会为您指出正确的位置

本文件不再维护。有关更新版本,请参阅本文件:

使用AppDomains可以做的一些事情:

  • 您可以在不危及程序稳定性的情况下关闭它
  • 您可以加载代码并授予比您自己的进程更少的权限(例如,您的进程运行完全受信任,但您在单独的AppDomain中加载代码,该AppDomain甚至无法在磁盘上创建文件。)
  • 您可以处理AppDomain的未处理异常,而不必使进程崩溃
  • 等等

简单地说,这是一个安全边界,最重要的是一个进程边界。就性能而言,一个进程中的多个AppDomain并不代表显著的开销。启动单独的进程而不是AppDomain的成本要高得多

JaredPar的回答是好的,只是他没有注意到AppDomains的特性,即您只能通过卸载程序集的AppDomain来卸载程序集。如果您是一个长期运行的操作系统进程,并且无论出于何种原因,您希望必须加载程序集,然后在以后卸载程序集,那么您需要一个AppDomain。这里的典型示例是ASP.NET,它根据需要加载应用程序代码程序集,然后在应用程序不再被积极使用时卸载它们

卸载功能的代价是独立性——您需要跨AppDomain边界进行通信,不能进行简单的方法调用。您需要管理AppDomain生命周期。等等

如果您只需要动态加载程序集,并且认为在单个进程的生命周期内不需要卸载它们,那么您可能不需要运行多个AppDomain。这里的一个好例子可能是一个支持插件模型的富应用程序,它在“etc”目录中嗅出插件程序集并将其全部加载。但是,如果插件模型要求卸载插件。。。嗯

还有更多的情况。例如,假设您希望同时加载程序集的两个不同版本。如果不将它们与AppDomains隔离,可能会遇到陷阱。但这将是相当罕见的

证明AppDomains存在的核心场景是必须能够卸载程序集的长时间运行的进程


当然,当您想要卸载程序集时,应用程序可以依赖操作系统进程。换句话说,您可以运行3个或4个协作进程,每个进程都有自己的程序集,当您想要卸载程序集时,只需关闭承载该程序集的进程。但是AppDomain提供了更高性能的机制来实现这一点,而不需要进程停止/启动或跨进程通信,这比前面描述的跨AppDomain通信更重。我的意思是,它仍在远程处理,但速度较慢,上下文切换更频繁。

主要的问题是,我不理解通过使用它们获得的功能。我读到他们是一个轻量级的过程,但他们似乎带来的不仅仅是这些,我可能会错过一些东西,可能会咬我以后。(我拿的比我需要的还多。如果你觉得必须定义一个词,为什么要用它呢?因为在回答计算机科学问题时使用法语很有趣。@BlueRaja DannyPflughoeft,它有助于教育那些可能不熟悉常用的外来词的人,这个词完美地概括了一个更笨拙的想法。)用英语定义。@SamHolder链接的维基百科文章说,英文翻译是“存在的理由”。对我来说,这似乎不是一个很笨拙的定义。就我的钱来说,这是最好的解释