应用程序域用于什么?

Jus*_*tin 15 c# c++ appdomain

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

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

特别是:

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

Dan*_*ker 14

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

没有办法单独卸载组件.因此,您必须创建一个单独的AppDomain来容纳可能需要卸载的任何内容.然后,您可以在必要时删除并重建整个AppDomain.

顺便说一句,破坏堆的本机代码无法受到CLR的任何功能的保护.最终,CLR本地实现并共享相同的地址空间.所以这个过程中的本机代码可以遍布CLR的内部!隔离行为不当(即大多数)本机代码的唯一方法是在OS级别实际进程隔离.启动多个.exe进程并让它们通过某种IPC机制进行通信.


Ash*_*Ash 6

我强烈推荐Jeffrey Richter的CLR Via C#.特别是第21章详细介绍了AppDomains的用途和用途.

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

  • AppDomains不会保护您的应用程序免受恶意非托管代码的侵害.如果这是一个问题,您很可能需要使用操作系统提供的完整进程隔离.

  • AppDomains之间的通信使用.NET远程执行来强制隔离.这可以通过引用编组或按值语义编组,在性能和灵活性之间进行权衡.

  • AppDomains是一种在托管代码中实现隔离等过程的轻量级方法.AppDomains被认为是轻量级的,因为您可以在单个进程中创建多个AppDomain,因此它们可以避免多个OS进程的资源和性能开销.此外,单个线程可以在一个AppDomain中执行代码,然后在另一个AppDomain中执行代码,因为Windows对AppDomains一无所知(请参阅使用System.AppDomain.CurrentDomain)