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