插件
# 插件
概念:插件(又译外挂,英文为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)是一种电脑程序,透过和应用程序(例如...
点击下载文档
本文2024-09-16 18:31:44发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-22730.html
您需要登录后才可以发表评论, 登录登录 或者 注册
最新文档
热门文章