当开发插件的时候需要用到反射,在客户端动态加载遍历程序集,并调用每个程序集的方法。
创建一个控制台应用程序,首先设计一个接口:
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;
}
再创建一个类库项目Assembly2,添加对控制台项目的引用,并创建实现ISay接口的类:
namespace Assembly2
{public class TwoSay : ISay{public void SaySth(){Console.WriteLine("我来自程序集2");
}}}
右键类库项目Assembly2--"属性"--"生成",把"输出路径"设置成Plugins文件夹,并生成类库项目Assembly2。
再次运行控制台项目。