iTimothy

Dynamic Plugins Manager (三) Demo

下面来演示一下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点,这些功能的演示,截图比较麻烦,大家可以直接使用测试程序测试即可。

支持原创技术分享,据说打赏我的人,都找到了女朋友!