原理
写接口、写类、生成 DLL、动态加载 DLL。
加载示例
private void LoadMonitoringFactories() { IMonitoringFactories = new List<IMonitoringFactory>(); string pluginsPath = AppDomain.CurrentDomain.BaseDirectory + "\plugins"; if (!Directory.Exists(pluginsPath)) { return; } string[] files = Directory.GetFiles(pluginsPath, "*.dll"); // pluginsPath 必须存在,否则 Directory.GetFiles 报错。 foreach (string file in files) { // 获取程序集。 Assembly assembly = Assembly.LoadFrom(file); // 获取所有类。 foreach (Type type in assembly.GetTypes()) { // 判断该类是否是实现了接口。 if (type.GetInterface(nameof(IMonitoringFactory)) == typeof(IMonitoringFactory)) { // 创建实例类,并加入。 IMonitoringFactory obj = (IMonitoringFactory)assembly.CreateInstance(type.FullName); IMonitoringFactories.Add(obj); } } } }
如上,从 plugins 文件夹中加载 dll 文件,然后判断是不是对应的 IMonitoringFactory,是,则创建 Instance,并加入 List,供后面调用。
关于目录,我们这里用的是:AppDomain.CurrentDomain.BaseDirectory,我觉得这样更保险,因为如果是“服务”的话,它能保证路径就是我们当前 exe 文件所在的路径,而不是 C:Windowssystem32。