JaredPar的回答很好,只是他没有注意到AppDomains的存在理由-也就是说,您只能通过卸载其AppDomain来卸载程序集。如果您是长时间运行的OS进程,并且希望由于某种原因而必须先加载然后再卸载程序集,则需要一个AppDomain。此处的典型示例是ASP.NET,它可以按需加载应用程序代码程序集,然后可以在不再活跃使用应用程序时稍后将其卸载。
您需要为卸载能力付出的代价是独立性-您需要跨越AppDomain边界进行通信,无法进行简单的方法调用。您需要管理AppDomain生命周期。等等。
如果你只是需要动态加载程序集,并且不认为你需要卸载它们单个进程的生命周期中,那么你可能并不需要运行多个应用程序域。一个很好的例子就是支持插件模型的丰富应用程序,它在“ etc”目录中嗅探插件程序集并全部加载它们。但是,如果插件模型要求卸载插件,那就好了。
有异常情况。像,假设您要同时加载两个不同版本的程序集。如果不与AppDomains隔离陷阱,则会遇到陷阱。但这将非常罕见。
证明存在AppDomains的核心场景是必须能够卸载程序集的长时间运行的过程。
当然,当您要卸载程序集时,应用程序可能依赖于OS进程。换句话说,您可以运行3个或4个协作进程,每个进程都有其自己的程序集,而当您要卸载程序集时,只需关闭承载该程序集的进程即可。但是AppDomain提供了一种更高性能的机制来执行此操作,而不需要进程停止/启动或跨进程通信,这比前面介绍的跨AppDomain通信还要重。我的意思是它仍在远程处理,但速度较慢,上下文切换更多。