C#使用反射开发插件_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > C#使用反射开发插件

C#使用反射开发插件

 2014/9/26 21:12:28  Darren Ji  程序员俱乐部  我要评论(0)
  • 摘要:当开发插件的时候需要用到反射,在客户端动态加载遍历程序集,并调用每个程序集的方法。创建一个控制台应用程序,首先设计一个接口:publicinterfaceISay{voidSaySth();}在控制台应用程序下创建Plugins文件夹,控制台的可执行文件和所有程序集文件都生成在这里。右键控制台项目--"属性"--"生成",把"输出路径"设置成Plugins文件夹。创建类库项目Assembly1,添加对控制台项目的引用,并创建实现ISay接口的类:namespaceAssembly1
  • 标签:C# 使用 插件 反射 开发

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

 

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

monospace; width: 100%; margin: 0em; background-color: #f0f0f0">    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

发表评论
用户名: 匿名