C# - 實作載入外部 DLL 外並使用 Method

摘要:C# - 實作載入外部 DLL 外並使用 Method

這陣子都在開發實作 WinForm,坦白說 Web 都快要忘光了,但也讓我見識到 WinForm 一些高深的功能。其中就是載入外部的 DLL 外並且使用 DLL 中的 Method,這技術在我師父及老手眼中,雖然是一項十年前就已經用過的東西。但小弟道行日淺,仍然是有一些新鮮感,以下就來實作唄...

步驟一:建立一個名為「TESTAP1」的 WinForm,並且設計一下畫面


步驟二:除了實作按鈕事件,外加實作兩個 Method,其中一個 Method 需要傳入參數

Code:

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

        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Hello Danny!!!");
        }

        public string GetHollePeggy()
        {
            return "Holle Peggy!!!";
        }

        public string GetDcLoveEP(string str_Param_1, string str_Param_2)
        {
            return string.Format("{0} LOVE {1}...^_^Y", str_Param_1, str_Param_2);
        }
    }
}

步驟三:點選專案並按右鍵,再點選屬性


步驟四:在應用程式頁籤中,將輸出類型從Windows應用程式改為類別庫,這樣才會讓此專案編譯後產生DLL,完成後請編譯專案


步驟五:再建立一個名為「TESTAP2」的 WinForm,並且設計一下畫面


步驟六:針對三個按鈕實作功能

Code:

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

        static Assembly assembly = Assembly.LoadFrom(@"C:\...省略...\TESTAP1.dll");
       
        private void button1_Click(object sender, EventArgs e)
        {
            Type type = assembly.GetType("TESTAP1.Form1");

            object obj = assembly.CreateInstance(type.FullName, true);

            ((Form)obj).ShowDialog();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            Type type = assembly.GetType("TESTAP1.Form1");

            MethodInfo miGetMethod = type.GetMethod("GetHollePeggy");

            object obj = assembly.CreateInstance(type.FullName, true);

            string strResult = (string)miGetMethod.Invoke(obj, null);

            MessageBox.Show(strResult);
        }

        private void button3_Click(object sender, EventArgs e)
        {
            Type type = assembly.GetType("TESTAP1.Form1");

            MethodInfo miGetMethod = type.GetMethod("GetDcLoveEP");

            object obj = assembly.CreateInstance(type.FullName, true);

            string strResult = (string)miGetMethod.Invoke(obj, new string[] { "Danny", "Peggy" });

            MessageBox.Show(strResult);
        }
    }
}

結果:

1.開啟 DLL


2.開啟 DLL 中的 Method


3.開啟 DLL 中的 Method 避帶入參數


參考:
C#實現反射調用動態加載的DLL文件中的方法
C#動態創建類的實例
通過Assembly來動態加載DLL
C#調用託管非託管動態庫(動態調用)