应用程序域用于什么?

时间:2010-02-05 12:13:46

标签: c# c++ appdomain

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

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

特别是:

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

5 个答案:

答案 0 :(得分:14)

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

无法单独卸载装配体。因此,您必须创建一个单独的AppDomain来容纳可能需要卸载的任何内容。然后,您可以在必要时删除并重建整个AppDomain。

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

答案 1 :(得分:6)

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

回答你的观点/问题:

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

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

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

答案 2 :(得分:4)

实际上,一个AppDomain中的严重失败不会影响其他人,为真。在坏事的情况下,最好还是打破这个过程。有几个例子,但老实说我没有记住它们 - 我只是心理上记下了“糟糕的事情=拆除过程(检查)”

AppDomain的好处:

  • 您可以卸载AppDomain;我将它用于一个基于来自数据库的数据编译自身(元编程)的系统 - 它可以启动一个appdomain来托管新的dll一段时间,然后在新数据可用(并构建)时安全地交换它
  • AppDomain之间的通信相对便宜。 IMO这是我唯一一次开心使用远程处理(尽管你仍然需要真的小心边界上的对象,以避免它们之间出现过多的引用,导致“融合“将额外的dll加载到主要AppDomain中,导致泄漏” - 这也很容易 - 只是CreateInstanceAndUnwrap(或者是CreateInstanceFromAndUnwrap?)。
  • vs一个额外的过程 - 你可以去任何一个方向;但是你不需要另外一个用于AppDomain工作的exe,并且设置你需要的任何通信要容易得多

答案 3 :(得分:1)

我并不是自称是AppDomains的专家,所以我的回答并不是无所不包。也许我应该从一个有点专家的人那里得到很好的介绍开始,看起来像是covering all aspects of AppDomain usage

我自己与AppDomains的主要遭遇是安全领域。在那里,我发现的最大优势是能够以高信任度运行主域,从而产生具有受限权限的多个子域。通过在不使用应用域的情况下限制高信任度的权限,受限制的进程仍然可以提升自己的权限。

答案 4 :(得分:0)

App Domain隔离策略用于运行完全独立的代码模块,以解决内存共享和稳定性问题,更多的是幻想而不是现实。