当前位置:首页 > C# > 正文

C#程序集的延迟加载详解(使用Assembly.LoadFrom实现动态加载DLL)

在C#开发中,有时我们并不希望在程序启动时就加载所有依赖的程序集(DLL文件),而是希望在需要时才动态加载。这种技术被称为程序集的延迟加载(Lazy Loading of Assemblies)。它不仅可以减少程序启动时间,还能节省内存资源,并支持插件式架构设计。

C#程序集的延迟加载详解(使用Assembly.LoadFrom实现动态加载DLL) C#程序集延迟加载 Assembly.LoadFrom 动态加载DLL C#反射机制 第1张

什么是Assembly.LoadFrom?

Assembly.LoadFrom 是 .NET 提供的一个静态方法,用于从指定路径动态加载程序集。与 Assembly.Load 不同,LoadFrom 接受的是文件路径(如 "C:\Plugins\MyPlugin.dll"),而不是程序集的全名。

使用 LoadFrom 可以在运行时根据条件加载不同的 DLL,非常适合实现插件系统、模块化应用或按需功能扩展。

基本使用步骤

  1. 准备一个外部的 DLL 文件(例如:MyLibrary.dll)
  2. 在主程序中使用 Assembly.LoadFrom 加载该 DLL
  3. 通过反射获取类型、创建实例并调用方法

完整代码示例

假设我们有一个名为 Calculator.dll 的程序集,其中包含一个 Adder 类:

// Calculator.dll 中的代码namespace CalculatorLib{    public class Adder    {        public int Add(int a, int b)        {            return a + b;        }    }}

现在,我们在主程序中动态加载这个 DLL 并调用 Add 方法:

using System;using System.Reflection;class Program{    static void Main()    {        try        {            // 使用 LoadFrom 动态加载程序集            Assembly assembly = Assembly.LoadFrom(@"C:\MyApp\Plugins\Calculator.dll");            // 获取 Adder 类型            Type adderType = assembly.GetType("CalculatorLib.Adder");            // 创建实例            object adderInstance = Activator.CreateInstance(adderType);            // 调用 Add 方法            MethodInfo addMethod = adderType.GetMethod("Add");            object result = addMethod.Invoke(adderInstance, new object[] { 10, 20 });            Console.WriteLine($"计算结果: {result}"); // 输出: 计算结果: 30        }        catch (Exception ex)        {            Console.WriteLine($"加载失败: {ex.Message}");        }    }}

注意事项与最佳实践

  • 路径问题:确保传入 LoadFrom 的路径是正确的绝对路径或相对路径。
  • 异常处理:DLL 可能不存在、版本不兼容或缺少依赖项,务必使用 try-catch 捕获异常。
  • 安全性:不要加载来源不可信的 DLL,以防执行恶意代码。
  • 重复加载:同一个程序集路径多次调用 LoadFrom 通常不会重复加载,但不同路径指向同一 DLL 可能导致多个副本被加载。

SEO关键词回顾

本文详细介绍了 C#程序集延迟加载 的实现方式,重点讲解了 Assembly.LoadFrom 的使用方法,并结合实际代码演示了如何实现 动态加载DLL。这一技术是 C#反射机制 的典型应用场景,适用于插件系统、模块化开发等高级架构设计。

掌握这些知识,你就能灵活控制程序集的加载时机,提升应用程序的性能与可维护性。