呼叫 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
沒有留言:
張貼留言