php/c#/asp/jsp互联网应用技术开发践行者QQ5267603

当前位置: 主页 > c#开发 >

c#外挂vs2005开发

时间:2011-11-04 23:05来源:未知 作者:admin 点击:
一般來講, 做 Plugin 時, 會 1. 先宣告一個 Interface 或是一個 Abstract Class. 2. 然後 Plugin 去 Implement 這個 Interface, 或是從這個 Abstract Class 下來. 3. 主程式動態把 Plugin Load 進來, 用這個 Interfac

一般來講, 做 Plugin 時, 會
1. 先宣告一個 Interface 或是一個 Abstract Class.
2. 然後 Plugin 去 Implement 這個 Interface, 或是從這個 Abstract Class 下來.
3. 主程式動態把 Plugin Load 進來, 用這個  Interface 或 Abstract Class 來操作.

我寫個 Sample, 您參考一下.

這個 Sample, 當你在主程式
按 F1 時, 會 load MyPlugin 進來, 並且 call MyPlugin1.funF1();
按 F2 時, 會 load MyPlugin 進來, 並且 call MyPlugin1.funF2();
按 F3 時, 會 load MyPlugin 進來, 並且 call MyPlugin2.funF1();
按 F4 時, 會 load MyPlugin 進來, 並且 call MyPlugin2.funF2();

1. 這是共用的宣告部份, 我把用 Interface 和 Abstract Class 的方式都放在例子裡.

namespace PluginInterface
{
    abstract public class AbstractPlugin   // 用 Abstract 的方法
    {
        abstract public void funF1();
        abstract public void funF2();
    }

    public interface InterfacePlugin         // 用 Interface  的方法
    {
        void funF1();
        void funF2();
    }
}

2. 這是我的 Plugin

using PluginInterface;
using System.Windows.Forms;

namespace MyPlugin
{
    public class MyPlugin1 : AbstractPlugin      // 這是 Plugin1, 用 Abstract Class
    {
        public override void funF1()
        {
            MessageBox.Show("This is MyPlugin1.funF1().");
        }

        public override void funF2()
        {
            MessageBox.Show("This is MyPlugin1.funF2().");
        }
    }

    public class MyPlugin2 : InterfacePlugin   // 這是 Plugin2, 用 Interface
    {
        void InterfacePlugin.funF1()
        {
            MessageBox.Show("This is MyPlugin2.funF1().");
        }

        void InterfacePlugin.funF2()
        {
            MessageBox.Show("This is MyPlugin2.funF2().");
        }
    }
}

3. 這是主程式

using System.Reflection;
using PluginInterface;

namespace PluginExample
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            try
            {
                switch (e.KeyCode)      // 這邊去做 Key 的 dispatch
                {
                    case Keys.F1: LoadPlugin1().funF1(); break;  // 按 F1,呼叫 MyPlugin1.funF1()
                    case Keys.F2: LoadPlugin1().funF2(); break;  // 按 F2,呼叫 MyPlugin1.funF2()
                    case Keys.F3: LoadPlugin2().funF1(); break;  // 按 F3,呼叫 MyPlugin2.funF1()
                    case Keys.F4: LoadPlugin2().funF2(); break;  // 按 F4,呼叫 MyPlugin2.funF2()
                }
            }
            catch { }
        }

        private AbstractPlugin LoadPlugin1()          // 這個是 Load Plugin1 進來的 Function
        {
            Assembly objPlugin;
            AbstractPlugin A = null;
            try
            {
                objPlugin = Assembly.LoadFrom("MyPlugin.dll");
                A = (AbstractPlugin)objPlugin.CreateInstance("MyPlugin.MyPlugin1");
            }
            catch
            {
                MessageBox.Show("Load Plugin1 fail.");
            }

            return A;
        }

        private InterfacePlugin LoadPlugin2()       // 這個是 Load Plugin2 進來的 Function
        {
            Assembly objPlugin;
            InterfacePlugin I = null;
            try
            {
                objPlugin = Assembly.LoadFrom("MyPlugin.dll");
                I = (InterfacePlugin)objPlugin.CreateInstance("MyPlugin.MyPlugin2");
            }
            catch
            {
                MessageBox.Show("Load Plugin2 fail.");
            }

            return I;
        }
    }
}


 

(责任编辑:admin)
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片