我啥时候使用 AppDomain?
Posted
技术标签:
【中文标题】我啥时候使用 AppDomain?【英文标题】:When would I use an AppDomain?我什么时候使用 AppDomain? 【发布时间】:2009-04-24 17:52:19 【问题描述】:我对反射还很陌生,我想知道我会使用(第二个)AppDomain 做什么?在业务应用程序中会有哪些实际应用程序?
【问题讨论】:
【参考方案1】:有很多用途。辅助 AppDomain 可以提供一定程度的隔离,类似于操作系统提供的进程隔离。
我使用它的一个实际用途是动态加载“插件”DLL。我想支持在主可执行文件启动时扫描目录以查找 DLL,加载它们并检查它们的类型以查看是否有任何实现了特定接口(即插件的合同)。如果不创建辅助 AppDomain,您将无法卸载可能没有实现所寻求接口的任何类型的 DLL/程序集。与其在您的流程中携带额外的程序集和类型等,您可以创建一个辅助 AppDomain,在那里加载程序集,然后检查类型。完成后,您可以摆脱辅助 AppDomain 以及您的类型。
【讨论】:
找到您要查找的 dll 后,您是否将这些插件加载到主 AppDomain 中?还是他们一直停留在第二个 AppDomain 中? 不,将它们加载到“主”域中,这样我们就不必来回编组调用。我们使用它们的另一个边缘情况是在将多个逻辑服务加载到它们自己的 AppDomain 中的服务中。老实说,这不是我的决定,我认为我们应该提供不同的服务。【参考方案2】:99% 的时间我会避免使用额外的 AppDomain。它们本质上是独立的过程。您必须将数据从一个域编组到另一个域,这会增加复杂性和性能问题。
人们试图使用 AppDomain 来解决程序集一旦加载到 AppDomain 中就无法卸载的问题。因此,您创建了第二个 AppDomain,您可以在其中加载动态程序集,然后卸载完整的 AppDomain 以释放与程序集关联的内存。
除非您需要动态加载和卸载程序集,否则它们并不值得担心。
【讨论】:
用于加载程序集以进行类型检查,就像在插件模型中一样,对它们很有用。所产生的只是一点额外的启动时间。 同意,但前提是您要在某个时候卸载它们,否则没有任何区别。同样对于 mot 业务应用程序,我不希望它们是必需的。 不同的 AppDomain 没有与进程相同的分隔。它们共享进程内存空间。【参考方案3】:当您必须拥有多个单例实例时,AppDomain 非常有用。例如,您有一个为某些设备实现通信协议的程序集,并且该程序集使用单例。如果您想实例化此类的多个实例(与多个设备通信)并且您希望这些实例不会相互干扰,那么 AppDomain 非常适合此目的。
但是,它确实使编程变得更加困难,因为您必须做更多的工作才能跨 AppDomain 边界进行通信。
【讨论】:
以上是关于我啥时候使用 AppDomain?的主要内容,如果未能解决你的问题,请参考以下文章
远程处理:从服务器 AppDomain 查找客户端 AppDomain / Assembly
为啥某些 .Net 程序集无法通过 AppDomain 的 GetAssemblies() 方法获得?
我啥时候应该使用 QThread::HighestPriority