下面来演示一下Plugins Manager,先看看我们事先做好的Interface和两个具体实现的插件.
Interface,接口定义: [code] using System; using System.Collections.Generic; using System.Linq; using System.Text;
namespace Component { public interface IComponent { string Invoke(); } } [/code]
整个接口,只声明了一个Invoke方法,这也是具体的插件必须实现的一个方法。
第一个插件类 class1.cs [code] namespace Component {
public class Class1 : MarshalByRefObject,IComponent
{
string message = string.Empty;
int number;
float number2;
public Class1(string input, int num)
{
message = input;
number = num;
number2 = 0;
}
public Class1(int num1, float num2)
{
message = "none";
number = num1;
number2 = num2;
}
public string Invoke()
{
return "This is TestLibrary. member---message:" + message + "number:" + number.ToString() + "number2:" +number2.ToString();
}
}
}
[/code]
第二个插件类 class2.cs
[code]
namespace Component { public class Class2 : MarshalByRefObject,IComponent { public Class2() { }
public string Invoke()
{
return "This is TestLibrary2 without construct param";
}
}
}
[/code]
这里我们看到区别,第一个插件,需要构造函数,第二个插件不需要构造函数,所以在配置文件中,第二个插件可以关闭掉ConstructParam这个节点。
下面我们将Class1.cs编译好,放到插件目录中,改名为TestLibrary.dll,将Class2.cs直接改名为TestLibrary2.cs,放到插件目录中。 演示的目的:插件1需要在加载时,构造初始化函数,而插件2不需要。 插件1,是已经编译好的dll,不需要实时编译,但是插件2需要。
下面是测试的截图
1.插件目录,一个放入编译好的dll,一个放入.cs源码
2.启动测试程序,看到2个插件都已经被加载
3.此时,再查看插件的目录,我们会看到Plugin Manager为我们编译,并生成的插件2的dll
4.查看插件的日志记录
5.插件的调用 选中TestLibrary,点击Invoke按钮:
选中TestLibrary2,点击Invoke按钮:
6.插件的动态卸载和发布 a.动态卸载,可以直接使用Plugins Manager的UnloadPluginByName直接通过程序调用卸载。也可以手动打开插件的配置文件,将EnablePlugin设置为False b.动态发布,直接在插件目录中,建立一个新的子目录,然后将插件的dll和xml配置文件直接拷入即可 关于第6点,这些功能的演示,截图比较麻烦,大家可以直接使用测试程序测试即可。