动态加载DLL的优势是什么?

6
寻找动态加载DLL相对于让应用程序默认加载DLL的优势。
6个回答

4

一个优点是支持插件架构。

例如,假设您想编写一个服务,以定期执行不同类型的任务。那些任务正在做什么实际上与您的核心服务无关,您的核心服务只是在正确的时间启动它们。而且,很可能您希望将来添加支持执行其他类型的任务(或者另一个开发人员可能希望这样做)。在这种情况下,通过实现插件方法,允许您放置更多(接口兼容的)dll,这些dll可以独立于核心服务编码。因此,添加对新任务的支持不需要重新构建/部署整个服务。如果特定任务需要更改,只需重新部署该dll,然后自动拾取。

它还要求其他开发人员不必关心服务本身,他们只需要知道要实现哪个接口,以便它可以被拾取。


如果您的系统是非插件架构类型的系统,会有哪些其他优势呢? - James
说实话,我只在插件架构中做过这种事情。除此之外,我想不出其他原因为什么我会考虑这样做。也许是出于某种安全目的——即仅加载允许特定用户访问功能的dll。但说实话,我甚至不确定这是否比在代码中控制其他方式更有效! - AdaTheDev
性能方面怎么样?实际上你只会很少使用它,但是加载了一个DLL是否会影响性能呢? - James
只需稍微多用一点内存即可加载。如果在使用时动态加载,然后立即卸载,则认为这将是更大的性能开销 - 它需要每次使用时执行额外的步骤(即使很少使用)- 尽管我没有硬数据来量化性能。 - AdaTheDev
看起来这似乎是唯一的优点...谢谢。 - James
请问新的.dll文件是如何部署的?是手动复制并粘贴到正确的位置吗?我很难理解这一部分。 - Shayan C

2
我们在处理应用程序中使用这种架构来处理不同客户需要的差异。每个 DLL 都有相似的结构,并实现相同的接口和入口方法“Process()”。我们有一个 XML 文件,根据客户和是否需要调用更多的方法来定义要加载哪个类。除非交易数非常高,否则性能不应该是一个问题。

1
动态加载共享对象是允许插件在运行时临时运行应用程序的机制。如果没有插件,模块化应用程序必须在链接时间或编译时间(查看nginx代码)组装。

1

你的问题涉及到C#/.NET,因此在这个世界上动态DLL加载需要高级编程技能。这可能会抵消动态DLL加载的所有潜在好处。你只需要编写很多“低级”代码。

在C++/Win32中,当一个DLL有一些新的API函数在旧操作系统上不可用时,我经常需要动态加载一个DLL。在这种情况下,我需要确保在运行时可用该API。我不能只是链接到这个DLL,因为它会导致在旧操作系统上应用程序加载错误。

正如提到的那样,在基于插件的环境中,你也可以获得一些好处。在这种情况下,如果动态加载DLL,你将对你的资源拥有更多的控制权。本质上,COM是动态DLL处理的一个很好的例子。


1
如果您只加载所需的DLL,则应用程序的启动时间应该更快。

0

动态加载DLL的另一个原因是为了提高程序的健壮性。

可以将DLL加载到所谓的AppDomain中。AppDomain基本上是一个沙盒容器,您可以将东西放入其中(DLL的部分或整个EXE),以在应用程序内部运行但与之隔离。

除非调用包含在AppDomain中的类型,否则它无法与您的应用程序交互。

因此,如果您有一个不可靠的第三方DLL或者没有源代码的DLL,您可以将其加载到AppDomain中,使其与主应用程序流程隔离开来。

最终结果是,如果第三方DLL出现问题,只会影响appdomain,而不会影响整个应用程序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接