zoukankan      html  css  js  c++  java
  • C#使用反射加载多个程序集

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

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

        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

  • 相关阅读:
    appium===报错Failure [INSTALL_FAILED_ALREADY_EXISTS: Attempt to re-install io.appium.settings without first uninstalling.的解决办法
    Appium===Appium+Python API(转)
    appium===出错时截图的方法,自动截图
    appium===setup/setupclass的区别,以及@classmathod的使用方法
    appium===元素定位
    appium===Python+Appium环境部署教程
    appium===报错adb server version (31) doesn’t match this client (39); killing…的解决办法
    appium===安卓SDK下载很慢的解决办法
    HTTP===通用首部字段的各种指令解释
    HTTP===http首部字段
  • 原文地址:https://www.cnblogs.com/darrenji/p/3995450.html
Copyright © 2011-2022 走看看