private static void LoadAssemblyInDefaultAppDomain() { string dir = AppContext.BaseDirectory + @"Libs\"; Console.WriteLine(dir); string assemblyName = "ClassLibrary"; for (int i = 0; i < 2; i++) { Assembly assembly = Assembly.LoadFile(dir + assemblyName + (i + 1).ToString() + ".dll"); Type type = assembly.GetType(assemblyName + (i + 1).ToString() + ".Class1"); DllDynamicImport.InterfaceTest instance = System.Activator.CreateInstance(type) as DllDynamicImport.InterfaceTest; list.Add(instance); try { list[i].Run(); } catch (Exception err) { Console.WriteLine("异常啦:" + err.Message); } } System.Console.ReadLine(); }
/// <summary> /// 导入程序集到默认应用域。应用域可以看作是一个exe启动之后的程序运行环境,该环境中负责创建和管理对象,一个进程可以开启多个应用域,多个环境之间无法直接调用对方管理的类对象。 /// 此处使用接口方式,展示了一个插件方式开发的基本框架。 /// </summary> private static void LoadAssemblyInDefaultAppDomain() { Console.WriteLine($"》》》》》》》》》》》》》》示例: 接口定义方式导入插件到默认应用域《《《《《《《《《《《《"); string dir = AppContext.BaseDirectory + @"Libs\"; Console.WriteLine($" 当前Lib目录:{dir}"); string assemblyName = "ClassLibrary"; for (int i = 0; i < 2; i++) { Console.WriteLine($" 导入ClassLibrary{i}.dll文件为程序集:{dir} 【开始】"); Assembly assembly = Assembly.LoadFile(dir + assemblyName + (i + 1).ToString() + ".dll"); Console.WriteLine($" 导入ClassLibrary{i}.dll文件:{dir} 【完成】"); Console.WriteLine(); Console.WriteLine($" 获取程序集中的ClassLibrary{i}中所有实现了InterfaceTest的类"); //如果导入特定名称的类,使用该方法,不过一般都是导入特定实现接口的类,所以应该使用循环 //Type type = assembly.GetType(assemblyName + (i + 1).ToString() + ".Class1"); foreach (Type type in assembly.GetTypes()) { Console.WriteLine($" 判断是否实现了接口InterfaceTest"); if (type.GetInterface("InterfaceTest") == typeof(InterfaceTest) && type.IsAbstract == false && type.IsInterface == false) { Console.WriteLine($" {type.FullName} 实现了接口InterfaceTest,所以可以直接创建类型实例,返回该接口"); DllDynamicImport.InterfaceTest instance = System.Activator.CreateInstance(type) as DllDynamicImport.InterfaceTest; Console.WriteLine($" 将刚创建的{type.Name}实例添加到列表中保存,此处可以将实例当作一个插件"); list.Add(instance); } else { Console.WriteLine($" {type.FullName}类型 没有 实现了接口InterfaceTest,跳过该类"); } } } Console.WriteLine($" 执行所有插件"); foreach (var pluginInterface in list) { try { pluginInterface.Run(); } catch (Exception err) { Console.WriteLine(" 异常:" + err.Message); } } System.Console.ReadLine(); }
/// <summary> /// 导入程序集到默认应用域。应用域可以看作是一个exe启动之后的程序运行环境,该环境中负责创建和管理对象,一个进程可以开启多个应用域,多个环境之间无法直接调用对方管理的类对象。 /// 此处使用接口+特性方式,展示了一个插件方式开发的基本框架。 /// </summary> private static void LoadAssemblyInDefaultAppDomain2() { Console.WriteLine($"》》》》》》》》》》》》》》示例: 接口定义+特性 导入插件到默认应用域《《《《《《《《《《《《"); string dir = AppContext.BaseDirectory + @"Libs\"; Console.WriteLine($" 当前Lib目录:{dir}"); string assemblyName = "ClassLibrary"; for (int i = 0; i < 2; i++) { Console.WriteLine($" 导入ClassLibrary{i}.dll文件为程序集:{dir} 【开始】"); Assembly assembly = Assembly.LoadFile(dir + assemblyName + (i + 1).ToString() + ".dll"); Console.WriteLine($" 导入ClassLibrary{i}.dll文件:{dir} 【完成】"); Console.WriteLine(); Console.WriteLine($" 获取程序集中的ClassLibrary{i}中所有定义了特性MyInterfaceAttribute.isenable=true,且 实现了InterfaceTest的类"); foreach (Type type in assembly.GetTypes()) { //获取类的特性 object[] attrs = type.GetCustomAttributes(false); foreach (Attribute att in attrs) { if (att.GetType() == typeof(MyInterfaceAttribute)) { MyInterfaceAttribute a = att as MyInterfaceAttribute; if (a.IsEnable) { Console.WriteLine($" 判断是否实现了接口InterfaceTest"); if (type.GetInterface("InterfaceTest") == typeof(InterfaceTest) && type.IsAbstract == false && type.IsInterface == false) { Console.WriteLine($" {type.FullName} 实现了接口InterfaceTest,所以可以直接创建类型实例,返回该接口"); DllDynamicImport.InterfaceTest instance = System.Activator.CreateInstance(type) as DllDynamicImport.InterfaceTest; Console.WriteLine($" 将刚创建的{type.Name}实例添加到列表中保存,此处可以将实例当作一个插件"); list.Add(instance); } else { Console.WriteLine($" {type.FullName}类型 没有 实现了接口InterfaceTest,跳过该类"); } } else { Console.WriteLine($" {type.FullName}类型 特性定义了关闭,跳过该类"); } } } } } Console.WriteLine($" 执行所有插件"); foreach (var pluginInterface in list) { try { pluginInterface.Run(); } catch (Exception err) { Console.WriteLine(" 异常:" + err.Message); } } System.Console.ReadLine(); }