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

所属分类: 软件编程 / C 语言 阅读数: 53
收藏 0 赞 0 分享

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

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

public interface ISay 
 { 
   void SaySth(); 
 } 

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

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

namespace Assembly1 
{ 
  public class OneSay : ISay 
  { 
    public void SaySth() 
    { 
      Console.WriteLine("我来自程序集1"); 
    } 
  } 
} 

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

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

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

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

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

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

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; 
    }

1

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

namespace Assembly2 
{ 
  public class TwoSay : ISay 
  { 
    public void SaySth() 
    { 
      Console.WriteLine("我来自程序集2"); 
    } 
  } 
} 

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

再次运行控制台项目。

2

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

更多精彩内容其他人还在看

C++语言数据结构 串的基本操作实例代码

这篇文章主要介绍了C语言数据结构 串的基本操作实例代码的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

C++中的异常处理机制详解

本文给大家分享的是C++中的异常处理机制。对如何处理异常、基本异常语法、异常保护代码等进行了探讨,推荐给大家。
收藏 0 赞 0 分享

C++ 二叉搜索树(BST)的实现方法

这篇文章主要介绍了C++ 二叉搜索树(BST)的实现方法,非常不错,具有参考借鉴价值,需要的的朋友参考下
收藏 0 赞 0 分享

C++调用Python基础功能实例详解

c++调用Python首先安装Python,本文以win7为例,给大家详细介绍C++调用Python基础功能,需要的朋友参考下吧
收藏 0 赞 0 分享

C++ 中pragma once 与 #ifndef _XXX_H_ #define _XXX_H_的区别

这篇文章主要介绍了C++ 中pragma once 与 #ifndef _XXX_H_ #define _XXX_H_的区别的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

visual studio 2013中配置opencv图文教程 Opencv2.4.9安装配置教程

这篇文章主要为大家详细介绍了Opencv2.4.9安装教程,以及在visualstudio 2013中opencv的配置步骤,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

VS2013安装配置和使用Boost库教程

这篇文章主要为大家详细介绍了VS2013安装配置和使用Boost库的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

visual studio 2015下boost库配置教程

这篇文章主要为大家详细介绍了visual studio 2015下boost库的配置教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

VS2010 boost标准库开发环境安装教程

这篇文章主要为大家详细介绍了VS2010 boost标准库开发环境的安装教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Microsoft Visual C++ 6.0开发环境搭建教程

这篇文章主要为大家详细介绍了Microsoft Visual C++ 6.0开发环境搭建教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享
查看更多