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

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

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

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

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

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

再次运行控制台项目。

C#使用反射加载多个程序集的更多相关文章

  1. Unity热更新之C#反射加载程序集

    用C#反射加载程序集的方式可以动态的从assetBundle资源包或其他资源包里加载脚本到工程中,即便是原工程中不存在的脚本. 我这里就用加载本地assetBundle的方式来进行讲解了,加载网络上的 ...

  2. 仅反射加载(ReflectionOnlyLoadFrom)的 .NET 程序集,如何反射获取它的 Attribute 元数据呢?

    原文:仅反射加载(ReflectionOnlyLoadFrom)的 .NET 程序集,如何反射获取它的 Attribute 元数据呢? 平时我们获取一个程序集或者类型的 Attribute 是非常轻松 ...

  3. C#.Net 如何动态加载与卸载程序集(.dll或者.exe)0-------通过应用程序域AppDomain加载和卸载程序集

    本博客中以“C#.Net 如何动态加载与卸载程序集(.dll或者.exe)”开头的都是引用莫问奴归处 微软装配车的大门似乎只为货物装载敞开大门,却将卸载工人拒之门外.车门的钥匙只有一把,若要获得还需要 ...

  4. C#.Net 如何动态加载与卸载程序集(.dll或者.exe)2----通过应用程序域AppDomain加载和卸载程序集之后,如何再返回原来的主程序域

    实现目的:动态加载dll,执行完毕之后可以随时卸载掉,并可以替换这些dll,以在运行中更新dll中的类. 其实就是通过应用程序域AppDomain加载和卸载程序集. 在这方面微软有篇文章http:// ...

  5. 使用C#的AssemblyResolve事件动态解析加载失败的程序集

    我们知道反射是 依赖注入 模式的基础,依赖注入要求只在项目中引用定义接口的程序集,而不引用接口实现类的程序集,因为接口实现类的程序集应该是通过反射来动态加载的,这样才能保证接口与其实现类之间的松耦合. ...

  6. .net加载失败的程序集重新加载

    在.net程序中,程序集是Lazy加载的,只有在用的时候才会去加载,当程序集加载失败时,会触发AppDomain.AssemblyResolve的事件,在这个事件中,我们甚至还可以进行补救,从别得地方 ...

  7. 通过应用程序域AppDomain加载和卸载程序集

    微软装配车的大门似乎只为货物装载敞开大门,却将卸载工人拒之门外.车门的钥匙只有一把,若要获得还需要你费一些心思.我在学习Remoting的时候,就遇到一个扰人的问题,就是Remoting为远程对象仅提 ...

  8. 使用C#的AssemblyResolve事件和TypeResolve事件动态解析加载失败的程序集

    我们知道反射是 依赖注入 模式的基础,依赖注入要求只在项目中引用定义接口的程序集,而不引用接口实现类的程序集,因为接口实现类的程序集应该是通过反射来动态加载的,这样才能保证接口与其实现类之间的松耦合. ...

  9. Quartz.net 2.x 学习笔记03-使用反射加载定时任务

    将定时任务信息存储在XML文件中,使用反射加载定时任务 首先新建一个MVC的空站点,使用NuGet添加对Quartz.net和Common.Logging.Log4Net1213的引用,同时使用NuG ...

随机推荐

  1. mysql数据库主从同步复制原理

    MySQL的Replication(英文为复制)是一个多MySQL数据库做主从同步的方案,特点是异步复制,广泛用在各种对MySQL有更高性能.更高可靠性要求的场合.与之对应的是另一个同步技术是MySQ ...

  2. 关于move

    procedure TForm4.Button1Click(Sender: TObject); var //动态数组 bytes1,bytes2: TBytes; //静态数组 bytes3,byte ...

  3. hihoCoder #1183 : 连通性一·割边与割点(求割边与各点模板)

    #1183 : 连通性一·割边与割点 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 还记得上次小Hi和小Ho学校被黑客攻击的事情么,那一次攻击最后造成了学校网络数据的丢 ...

  4. 宝塔Linux常用命令

    https://www.bt.cn/bbs/thread-1186-1-1.html 2017年3月8日发布全新架构的宝塔Linux 面板3.1Beta版,到现在的5.2.0正式版,历经100多天打磨 ...

  5. Zabbix监控实例

    本节内容: zabbix web添加主机 定义Items 创建graph 创建template 一.zabbix web添加主机 1. 进入zabbix web界面,点击配置—>主机—>创 ...

  6. OnClickListener接口

    package com.example.wang.testapp2; import android.support.v7.app.AppCompatActivity; import android.o ...

  7. InterSystems Ensemble学习笔记(一) Ensemble介绍及安装

    系列目录 InterSystems Ensemble学习笔记(一) Ensemble介绍及安装InterSystems Ensemble学习笔记(二) Ensemble创建镜像, 实现自动故障转移 一 ...

  8. winform框架源码-Devexpress开发框架

    链接: https://pan.baidu.com/s/1TnDj6qftGEUl3sTB8QXs_w 提取码: 关注公众号[GitHubCN]回复获取   开发模式:C/S C/S采用的是dev14 ...

  9. python的简介(一)

    1. Python的种类 Cpython     Python的官方版本,使用C语言实现,使用最为广泛,CPython实现会将源文件(py文件)转换成字节码文件(pyc文件),然后运行在Python虚 ...

  10. python和mongodb简单交互

    python和mongodb简单交互 1.安装pymongo: pip3 install pymongo 2.pymongo的简单用法: # /usr/bin/env python3 import p ...