none
如何用C# 2005撰寫外掛程式

    問題

  • 我想設計的功能有兩項:

    1.利用hot key呼叫外掛程式

    2.特定的hot key對應特定的事件執行不同的方法

    3.特定的事件能在執行中的程式表現

    不過目前的瓶頸是

    1.如何設計hot key模式對應在外掛上

    2.呼叫外掛時,如何執行外掛而將事件呈現在執行中的程式

     

    謝謝

    2006年7月19日 下午 04:21

解答

  • 不好意思, 不是很了解您的問題, 我就我所了解的, 做一個說明, 希望有點幫助.

    一般來講, 做 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;
            }
        }
    }


    2006年7月26日 上午 01:30