插件

栏目:云星空知识作者:金蝶来源:金蝶云社区发布:2024-09-16浏览:1

插件

# 插件 概念:插件(又译外挂,英文为Plug-in、Plugin、add-in、addin、add-on、addon或extension)是一种电脑程序,透过和应用程序(例如网页浏览器,电子邮件客户端)的互动,用来替应用程序增加一些所需要的特定的功能。最常见的有游戏、网页浏览器的插件和媒体播放器的插件。 # 通过C#实现插件式开发 为了项目更好的扩展,下面通过实战了解以下动态加载技术 # 开发步骤 - 1、新建一个类库项目,定义接口 ```C# using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace PluginInterface1 { public interface IPlugin { string Show(); } } ``` - 2、编写一个类库项目,实现该接口 注意点,这里要引用第一个项目的dll类库,找到源头接口 ```C# using PluginInterface1; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ClassLibrary { public class PluginClass : IPlugin { public string Show() { return "我就是插件,我就是外挂"; } } } ``` - 3、主程序利用反射机制找到两个类库,并实现该方法 新建一个控制台应用程序项目。新建一个文件夹"Plugins"放入两个类库编译完的dll,方便主程序调用 实现代码如下: ```C# using PluginInterface1; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; namespace MyConsoleApp { internal class Program { static void Main(string[] args) { Program p = new Program(); List<string> pluginpath = p.FindPlugin(); pluginpath = p.DeleteInvalidPlungin(pluginpath); foreach (string filename in pluginpath) { try { //获取文件名 string asmfile = filename; string asmname = Path.GetFileNameWithoutExtension(asmfile); if (asmname != string.Empty) { // 利用反射,构造DLL文件的实例 Assembly asm = Assembly.LoadFile(asmfile); //利用反射,从程序集(DLL)中,提取类,并把此类实例化 Type[] t = asm.GetExportedTypes(); foreach (Type type in t) { if (type.GetInterface("IPlugin") != null) { IPlugin show = (IPlugin)Activator.CreateInstance(type); Console.Write(show.Show()); } } } } catch (Exception ex) { Console.Write(ex.Message); } } Console.ReadLine(); } private List<string> FindPlugin() { List<string> pluginpath = new List<string>(); try { //获取程序的基目录 string path = "C:\\Users\\Think\\source\\repos\\PluginInterface\\MyConsoleApp"; //合并路径,指向插件所在目录。 path = Path.Combine(path, "Plugins"); foreach (string filename in Directory.GetFiles(path, "*.dll")) { pluginpath.Add(filename); } } catch (Exception ex) { Console.Write(ex.Message); } return pluginpath; } //载入插件,在Assembly中查找类型 private object LoadObject(Assembly asm, string className, string interfacename , object[] param) { try { //取得className的类型 Type t = asm.GetType(className); if (t == null || !t.IsClass || !t.IsPublic || t.IsAbstract || t.GetInterface(interfacename) == null ) { return null; } //创建对象 Object o = Activator.CreateInstance(t, param); if (o == null) { //创建失败,返回null return null; } return o; } catch { return null; } } //移除无效的的插件,返回正确的插件路径列表,Invalid:无效的 private List<string> DeleteInvalidPlungin(List<string> PlunginPath) { string interfacename = typeof(IPlugin).FullName; List<string> rightPluginPath = new List<string>(); //遍历所有插件。 foreach (string filename in PlunginPath) { try { Assembly asm = Assembly.LoadFile(filename); //遍历导出插件的类。 foreach (Type t in asm.GetExportedTypes()) { //查找指定接口 Object plugin = LoadObject(asm, t.FullName, interfacename, null); //如果找到,将插件路径添加到rightPluginPath列表里,并结束循环。 if (plugin != null) { rightPluginPath.Add(filename); break; } } } catch { throw new Exception(filename + "不是有效插件"); } } return rightPluginPath; } } } ``` # 项目代码结构图 ![image.webp](/download/0100fb575cc556104808adbc0dcc970b1dac.webp) # 项目执行效果图 ![image.webp](/download/01007f598014c5da489997489f71b31fa896.webp) # 总结 通过此次项目实战,接触到了插件式开发模式,现在可以说写完这些大家已经成为小小的外挂开发者了。

插件

# 插件概念:插件(又译外挂,英文为Plug-in、Plugin、add-in、addin、add-on、addon或extension)是一种电脑程序,透过和应用程序(例如...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息