c# 动态加载模块插件示例

csharp 复制代码
public static class TestManager
{
    static string dllPath = "./TestServices.dll";

    static Dictionary<string, ITest> TestScheme = new Dictionary<string, ITest>();

    static public ITest CurrentTest = null;

    static public void Load()
    {
        if (!File.Exists(dllPath))
        {
            isEnable = false;
            return;
        }

        TestScheme.Clear();

        var dllAssembly = Assembly.LoadFrom(dllPath);

        var types = dllAssembly.GetTypes()
                               .Where(x => x.GetInterface("ITest") != null);

        foreach (Type type in types)
        {
            var attributes = type.GetCustomAttributes<TestAttribute>(false);

            if (attributes.Count() <= 0)
            {
                continue;
            }

            TestAttribute testAttr = attributes.ElementAt(0);

            if (testAttr.Tools.Contains(GCH.CurTool))
            {
                var instance = (ITest)Activator.CreateInstance(type);
                TestScheme.Add(type.Name, instance);
            }
        }

        if (TestScheme.Count > 0)
        {
            isEnable = true;
        }
    }
}

代码结构分析:

  1. 类定义和成员变量

    • TestManager 是一个静态类,包含了一些静态成员变量和静态方法。
    • dllPath:存储了一个相对路径 "./TestServices.dll",表示要加载的 DLL 文件的位置。使用相对路径可能会导致在不同的工作目录下出现问题,因为相对路径是相对于程序的启动目录的。
    • TestScheme:一个静态的 Dictionary<string, ITest> 类型的字典,用于存储根据一定条件筛选出来的测试方案,其中键是类型的名称,值是实现了 ITest 接口的对象实例。
    • CurrentTest:一个静态的 ITest 类型的对象,初始化为 null,从代码来看,它可能是用于存储当前正在使用的测试对象,但在提供的代码中未看到其使用或赋值逻辑,可能是代码不完整或者尚未实现相应功能。
    • Load:一个静态方法,用于加载测试相关的内容。
  2. Load 方法的详细分析

    • 文件存在性检查

      csharp 复制代码
      if (!File.Exists(dllPath))
      {
          isEnable = false;
          return;
      }

      首先检查 dllPath 指向的文件是否存在,如果不存在,将 isEnable (未在代码中声明,会导致编译错误)设置为 false 并返回,结束方法执行。这里可能遗漏了 isEnable 的声明。

    • 清空字典

      csharp 复制代码
      TestScheme.Clear();

      清空 TestScheme 字典,以确保在重新加载时不会残留之前的数据。

    • 程序集加载和类型筛选

      csharp 复制代码
      var dllAssembly = Assembly.LoadFrom(dllPath);
      var types = dllAssembly.GetTypes().Where(x => x.GetInterface("ITest")!= null);
      • 使用 Assembly.LoadFrom 从指定的 DLL 路径加载程序集。
      • 通过 GetTypes 获取程序集中的所有类型,并使用 Where 筛选出实现了 ITest 接口的类型。
    • 属性检查和实例创建

      csharp 复制代码
      foreach (Type type in types)
      {
          var attributes = type.GetCustomAttributes<TestAttribute>(false);
          if (attributes.Count() <= 0)
          {
              continue;
          }
          TestAttribute testAttr = attributes.ElementAt(0);
          if (testAttr.Tools.Contains(GCH.CurTool))
          {
              var instance = (ITest)Activator.CreateInstance(type);
              TestScheme.Add(type.Name, instance);
          }
      }
      • 对于筛选出来的每个类型,使用 GetCustomAttributes<TestAttribute>(false) 获取该类型的 TestAttribute 集合。
      • 如果 TestAttribute 集合的元素数量小于等于 0,使用 continue 跳过该类型。
      • TestAttribute 集合的第一个元素(使用 ElementAt(0),如果集合为空,会引发异常)。
      • 检查 TestAttributeTools 属性是否包含 GCH.CurTool,如果包含,使用 Activator.CreateInstance 创建该类型的实例,并添加到 TestScheme 字典中,键为类型的名称。
    • 启用状态设置

      csharp 复制代码
      if (TestScheme.Count > 0)
      {
          isEnable = true;
      }

      根据 TestScheme 字典中的元素数量,将 isEnable (未声明)设置为 true 或保持为 false,以表示是否成功加载了测试方案。

相关推荐
z落落9 小时前
C# 多接口实现、重名成员、显式实现、接口继承+抽象类和接口区别
java·开发语言·c#
咸鱼翻身小阿橙9 小时前
高斯模糊降噪/磨皮算法降噪图像
前端·opencv·算法·webpack·c#
Song_da_da_20 小时前
C#与VisionPro联合编程实战:机器视觉二次开发完整指南
开发语言·microsoft·c#
加号31 天前
【C#】 Web API 自定义配置函数请求路径:从路由本质到灵活架构设计
开发语言·c#
happyprince1 天前
11-Hugging Face Transformers 分布式与并行系统深度分析
分布式·c#·wpf
csdn_aspnet1 天前
C# list集合 多属性排序
c#·list·linq·排序
加号31 天前
【WPF】 基于 Canvas 读取并渲染 DXF 文件的技术指南
c#·wpf
天下无敌笨笨熊1 天前
SNMP协议开发心得
网络协议·c#
创可贴治愈心灵1 天前
AI浪潮下C#就业前景剖析:深耕C#为主,按需选修Java与Python
java·人工智能·c#
专注VB编程开发20年1 天前
开发VS2026插件最佳方案:老式VSIX EnvDTE
ide·c#·visual studio