首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >应用程序域用于什么?

应用程序域用于什么?
EN

Stack Overflow用户
提问于 2010-02-05 12:13:46
回答 5查看 2.8K关注 0票数 16

我大致了解AppDomain是什么,但是我并不完全理解AppDomain的用途。

我参与了一个基于大型服务器的C# / C++应用程序,我想知道如何使用AppDomains可以提高稳定性/安全性/性能。

特别是:

  • 我理解,一个域中的错误或致命异常不会影响运行在同一进程中的其他应用程序域--对于非托管/ C++异常,甚至堆损坏或其他内存问题,这是否也适用。
  • 应用程序间的通信是如何工作的?
  • 使用AppDomains与简单地生成许多进程有什么不同?
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-02-05 12:40:18

AppDomain的基本用例是在托管第三方代码的环境中,因此不仅需要动态加载程序集,还需要卸载它们。

无法单独卸载程序集。因此,您必须创建一个单独的AppDomain来存放可能需要卸载的任何内容。然后,您可以在必要时破坏和重建整个AppDomain。

顺便说一句,CLR的任何特性都无法保护导致堆损坏的本机代码。最终,CLR是以本地方式实现的,并且共享相同的地址空间。这样,过程中的本机代码就可以在CLR的内部到处乱写!隔离行为恶劣(即大多数)本机代码的唯一方法是在OS级别上进行实际的进程隔离。启动多个.exe进程,并让它们通过某些IPC机制进行通信。

票数 15
EN

Stack Overflow用户

发布于 2010-02-05 13:07:34

我强烈推荐杰弗里·里希特的通过C#实现CLR。特别是,第21章详细介绍了AppDomains的用途和用途。

在回答你的观点/问题时:

  • AppDomains不会保护应用程序不受恶意非托管代码的影响。如果这是一个问题,您很可能需要使用操作系统提供的完全进程隔离。
  • AppDomains之间的通信使用.NET远程处理来执行隔离。这可以通过基于引用的封送或通过值语义进行封送,在性能和灵活性之间进行权衡。
  • AppDomains是在托管代码中实现类似于隔离的过程的一种轻量级方法。AppDomains被认为是轻量级的,因为您可以在单个进程中创建多个AppDomains,因此它们避免了资源和性能开销、多个OS进程。另外,一个线程可以在一个AppDomain中执行代码,然后在另一个AppDomain中执行代码,因为Windows对AppDomains一无所知(参见使用System.AppDomain.CurrentDomain)
票数 6
EN

Stack Overflow用户

发布于 2010-02-05 12:39:53

实际上,一个AppDomain中的关键失败不能影响其他的,这是不正确的。如果发生了不好的事情,最好的办法就是拆掉这个过程。有几个例子,但老实说,我还没有记住它们--我只是在心里记了一句:“坏事情=拆卸过程(检查)”

AppDomain的好处

  • 您可以卸载一个dll;我将它用于一个基于数据库数据编译自身(元编程)的系统--它可以旋转一个appdomain来承载新的dll一段时间,然后在新数据可用(并生成)时安全地交换它。
  • AppDomain之间的通信相对便宜。IMO这是我唯一乐意使用远程处理的时候(尽管您仍然需要非常小心地处理边界上的对象,以避免它们之间的引用流血,导致“融合”将额外的dll加载到主AppDomain中,导致泄漏)--这也很容易--只有CreateInstanceAndUnwrap (或者是CreateInstanceFromAndUnwrap?)。
  • vs生成一个额外的进程--您可以任意选择;但是您不需要AppDomain工作的另一个exe,而且设置任何您需要的逗号要容易得多。
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2207053

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档