111,129
社区成员
发帖
与我相关
我的任务
分享
public interface IPlugin {
string GetPluginName();//获取插件的名字
string Run(string strArgs);//插件的具体执行时候调用的方法
}
定义一个标准 那么其他想给我程序编写插件的人 就必须按照上面的方式去实现
此时我就可以编写一个TestPlugin.dll 大概如下:
public class TestPlugin : IPlugin {
public string GetPluginName() {
return "TestPlugin";
}
public string Run(string strArgs) {
return "string is [" + strArgs + "]";
}
}
然后我主程序运行的时候 就可以去遍历(假设插件目录为./Plugin)Plugin目录下的所有dll文件 假设有一个TestPlugin.dll文件
public static IPlugin GetInterface(string strFileName) {
Assembly asm = Assembly.LoadFile(strFileName);
foreach (var t in asm.GetTypes()) {
if (t.GetInterface("IPlugin") != null) {
return (IPlugin)Activator.CreateInstance(t);
}
}
return null;
}
IPlugin i = GetInterface("绝对路径\\TestPlugin.dll");
假设我的程序中有一个右键菜单.菜单项.Add(I.GetPluginName(),i/*假设I会保存到菜单项Tag属性中*/);
//然后对应菜单项的点击事件中
private void XXX_Click(object sender,EventArgs e){
((IPlugin)(sender as 菜单项).Tag).Run("this is a test");
}
通过接口的方式去调用插件 而不关心插件的具体实现是什么功能
就像PS软件中有很多滤镜插件一样 PS并不需要去关心你插件是什么功能 它只需要定义一个接口 比如:
public interface IPlugin {
string GetPluginName();//获取插件的名字
Bitmap Run(Bitmap bmp);//插件的具体执行时候调用的方法
}
它只需要关心 当我执行这个插件的时候 我会给你一张图然后你处理完返回一张图给我就是 至于这个插件的功能是 将人美化还是丑化还是把图形变成模糊那是实现着需要做的事情 而不是定义接口的人需要去做的事情 所以接口并不需要具体的实现 而是需要声明一堆的标准 让别人来实现
为什么你头上都是头发呢?