一个优点是支持插件架构。
例如,假设您想编写一个服务,以定期执行不同类型的任务。那些任务正在做什么实际上与您的核心服务无关,您的核心服务只是在正确的时间启动它们。而且,很可能您希望将来添加支持执行其他类型的任务(或者另一个开发人员可能希望这样做)。在这种情况下,通过实现插件方法,允许您放置更多(接口兼容的)dll,这些dll可以独立于核心服务编码。因此,添加对新任务的支持不需要重新构建/部署整个服务。如果特定任务需要更改,只需重新部署该dll,然后自动拾取。
它还要求其他开发人员不必关心服务本身,他们只需要知道要实现哪个接口,以便它可以被拾取。
你的问题涉及到C#/.NET,因此在这个世界上动态DLL加载需要高级编程技能。这可能会抵消动态DLL加载的所有潜在好处。你只需要编写很多“低级”代码。
在C++/Win32中,当一个DLL有一些新的API函数在旧操作系统上不可用时,我经常需要动态加载一个DLL。在这种情况下,我需要确保在运行时可用该API。我不能只是链接到这个DLL,因为它会导致在旧操作系统上应用程序加载错误。
正如提到的那样,在基于插件的环境中,你也可以获得一些好处。在这种情况下,如果动态加载DLL,你将对你的资源拥有更多的控制权。本质上,COM是动态DLL处理的一个很好的例子。
动态加载DLL的另一个原因是为了提高程序的健壮性。
可以将DLL加载到所谓的AppDomain中。AppDomain基本上是一个沙盒容器,您可以将东西放入其中(DLL的部分或整个EXE),以在应用程序内部运行但与之隔离。
除非调用包含在AppDomain中的类型,否则它无法与您的应用程序交互。
因此,如果您有一个不可靠的第三方DLL或者没有源代码的DLL,您可以将其加载到AppDomain中,使其与主应用程序流程隔离开来。
最终结果是,如果第三方DLL出现问题,只会影响appdomain,而不会影响整个应用程序。