我大致了解AppDomain是什么,但我并不完全了解AppDomain的用途。
我参与了一个基于服务器的大型C#/ C ++应用程序,我想知道如何使用AppDomains来提高稳定性/安全性/性能。
特别是:
答案 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
?)。AppDomain
工作的exe,并且设置你需要的任何通信要容易得多答案 3 :(得分:1)
我并不是自称是AppDomains的专家,所以我的回答并不是无所不包。也许我应该从一个有点专家的人那里得到很好的介绍开始,看起来像是covering all aspects of AppDomain usage。
我自己与AppDomains的主要遭遇是安全领域。在那里,我发现的最大优势是能够以高信任度运行主域,从而产生具有受限权限的多个子域。通过在不使用应用域的情况下限制高信任度的权限,受限制的进程仍然可以提升自己的权限。
答案 4 :(得分:0)
App Domain隔离策略用于运行完全独立的代码模块,以解决内存共享和稳定性问题,更多的是幻想而不是现实。