C# 动态加载DLL的优点是什么?

C# 动态加载DLL的优点是什么?,c#,.net,dll,dynamic-loading,C#,.net,Dll,Dynamic Loading,寻找动态加载DLL的优势,而不是让应用程序默认加载DLL。动态加载共享对象是允许插件临时运行应用程序的机制。如果没有插件,模块化应用程序将不得不在链接时或编译时组装起来(看看nginx的代码)。您的问题是关于C#/.NET的,因此在这个世界上,动态DLL加载需要高级编程技能。这可以补偿动态DLL加载的所有潜在好处。您只需编写大量“低级”代码 在C++/Win32中,当DLL有一些旧操作系统上无法使用的新API函数时,我通常必须动态加载DLL。在这种情况下,我需要确保此API在运行时可用。我不能仅

寻找动态加载DLL的优势,而不是让应用程序默认加载DLL。

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

您的问题是关于C#/.NET的,因此在这个世界上,动态DLL加载需要高级编程技能。这可以补偿动态DLL加载的所有潜在好处。您只需编写大量“低级”代码

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


如前所述,在基于插件的环境中,您还可以获得一些好处。在这种情况下,如果动态加载DLL,您将可以更好地控制资源。本质上,COM是动态DLL处理的一个很好的例子。

一个优点是支持插件体系结构

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


它还要求其他开发人员不必关心服务本身,他们只需要知道要实现什么样的接口就可以使用它。

我们将此体系结构用于处理应用程序,以处理不同客户需要的差异。每个DLL具有相似的结构,并实现相同的接口和输入方法“Process()。我们有一个XML文件,它根据客户定义要加载的类,以及除了需要调用的流程之外是否还有更多的方法。在事务计数变得非常高之前,性能不应该是一个问题

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

动态加载DLL的另一个原因是健壮性

可以将DLL加载到AppDomain中。Appdomain基本上是一个沙盒容器,您可以将东西放入其中(DLL的部分或整个EXE)以独立运行,但要在应用程序中运行

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

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


最终的结果是,如果第三方DLL抛出抖动,则只有appdomain而不是整个应用程序受到影响。

如果您的系统是非插件体系结构类型的系统,该怎么办。他们还有什么其他优势呢?我唯一做过的就是在插件架构tbh中。我想不出另外一个原因,否则我会考虑其他问题。可能是出于某种安全目的,即仅加载允许特定用户访问的功能的DLL。但是tbh我甚至不确定这是否是一种有效的方法来控制代码中的其他方式!性能如何?当实际上很少使用DLL时,加载DLL有关系吗?加载DLL只会占用多一点内存。如果您在使用时动态加载它,然后直接卸载,那么我认为这将是一个更大的性能开销-每次使用它时都有额外的步骤执行(即使很少)-尽管我没有难以量化性能的统计数据。从外观上看,这似乎是唯一的优势…谢谢。