Dynamic Plugins Manager (三) Demo
2008-12-11 12:26 Timothy Ye 阅读(335) 评论(0) 编辑 收藏 举报
下面来演示一下Plugins Manager,先看看我们事先做好的Interface和两个具体实现的插件.
Interface,接口定义:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Component
{
public interface IComponent
{
string Invoke();
}
}
整个接口,只声明了一个Invoke方法,这也是具体的插件必须实现的一个方法。
第一个插件类 class1.cs
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();
}
}
}
第二个插件类 class2.cs
namespace Component
{
public class Class2 : MarshalByRefObject,IComponent
{
public Class2()
{
}
public string Invoke()
{
return "This is TestLibrary2 without construct param";
}
}
}
这里我们看到区别,第一个插件,需要构造函数,第二个插件不需要构造函数,所以在配置文件中,第二个插件可以关闭掉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点,这些功能的演示,截图比较麻烦,大家可以直接使用测试程序测试即可。
Interface,接口定义:
程序代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Component
{
public interface IComponent
{
string Invoke();
}
}
整个接口,只声明了一个Invoke方法,这也是具体的插件必须实现的一个方法。
第一个插件类 class1.cs
程序代码
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();
}
}
}
第二个插件类 class2.cs
程序代码
namespace Component
{
public class Class2 : MarshalByRefObject,IComponent
{
public Class2()
{
}
public string Invoke()
{
return "This is TestLibrary2 without construct param";
}
}
}
这里我们看到区别,第一个插件,需要构造函数,第二个插件不需要构造函数,所以在配置文件中,第二个插件可以关闭掉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点,这些功能的演示,截图比较麻烦,大家可以直接使用测试程序测试即可。