C#使用反射加载多个程序集的实现方法

时间:2022-04-11 03:09:48

当开发插件的时候需要用到反射,在客户端动态加载遍历程序集,并调用每个程序集的方法。

创建一个控制台应用程序,首先设计一个接口:

?
1
2
3
4
public interface ISay
 {
   void SaySth();
 }

在控制台应用程序下创建Plugins文件夹,控制台的可执行文件和所有程序集文件都生成在这里。右键控制台项目--"属性"--"生成",把"输出路径"设置成Plugins文件夹。

创建类库项目Assembly1,添加对控制台项目的引用,并创建实现ISay接口的类:

?
1
2
3
4
5
6
7
8
9
10
namespace Assembly1
{
  public class OneSay : ISay
  {
    public void SaySth()
    {
      Console.WriteLine("我来自程序集1");
    }
  }
}

右键类库项目Assembly1--"属性"--"生成",把"输出路径"设置成Plugins文件夹,并生成类库项目Assembly1。

客户端需要找到所有程序集中所有实现ISay接口的类。其基本思路是:

→找到Plugins文件夹下所有dll后缀的文件

→遍历这些文件,根据文件名动态加载程序集

→遍历程序集中实现ISay接口的类型,并保存到ISay类型的集合中

→客户端遍历ISay类型的集合,调用ISay的接口方法

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
class Program
  {
    static void Main(string[] args)
    {
      foreach (var say in GetSpeakers())
      {
        say.SaySth();
      }
    }
    static List<ISay> GetSpeakers()
    {
      List<ISay> result = new List<ISay>();
      //获取项目根目录下的Plugins文件夹
      string dir = Directory.GetCurrentDirectory();
      //遍历目标文件夹中包含dll后缀的文件
      foreach (var file in Directory.GetFiles(dir + @"\", "*.dll"))
      {
        //加载程序集
        var asm = Assembly.LoadFrom(file);
        //遍历程序集中的类型
        foreach (var type in asm.GetTypes())
        {
          //如果是ISay接口
          if (type.GetInterfaces().Contains(typeof (ISay)))
          {
            //创建接口类型实例
            var isay = Activator.CreateInstance(type) as ISay;
            if (isay != null)
            {
              result.Add(isay);
            }
          }
        }
      }
      return result;
    }

C#使用反射加载多个程序集的实现方法

再创建一个类库项目Assembly2,添加对控制台项目的引用,并创建实现ISay接口的类:

?
1
2
3
4
5
6
7
8
9
10
namespace Assembly2
{
  public class TwoSay : ISay
  {
    public void SaySth()
    {
      Console.WriteLine("我来自程序集2");
    }
  }
}

右键类库项目Assembly2--"属性"--"生成",把"输出路径"设置成Plugins文件夹,并生成类库项目Assembly2。

再次运行控制台项目。

C#使用反射加载多个程序集的实现方法

以上这篇C#使用反射加载多个程序集的实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。