2022年3月18日 星期五

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

呼叫 DLL 裡的 Form , Function


namespace DLL_RS232

{

    public partial class cDLL_RS232 : Form

    {

        String[] TestItems = {

            "Test Item 1", "1000"

            , "Test Item 2", "2000"

            , "Test Item 3", "3000"

            , "Test Item 4", "4000"

        };

        public cDLL_RS232()

        {

            InitializeComponent();

            Console.WriteLine("cDLL_RS232");

        }

        public string[] GetItemsList()

        {

            Console.WriteLine("GetItemsList");

            return TestItems;

        }

        public int Add(int a, int b)

        {

            return a + b;

        }


        private void label1_Click(object sender, EventArgs e)

        {

            int value = Add(11, 22);

            label1.Text = value.ToString();

        }

    }

}

            string path = @".\DLL_RS232.dll";

            Assembly assembly = Assembly.LoadFrom(path);

            Type type;  //獲取程式集例項中具有指定名稱的Type物件

            type = assembly.GetType("DLL_RS232.cDLL_RS232");

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

            ((Form)obj).ShowDialog();


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

            TestItems = (string[])miGetMethod.Invoke(obj, null);


            miGetMethod = type.GetMethod("Add");

            int strResult = (int)miGetMethod.Invoke(obj, new object[] { 11, 22 });



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#調用託管非託管動態庫(動態調用)

資料來源:https://dotblogs.com.tw/dc690216/2010/08/01/16939

沒有留言: