using System;
using System.Windows.Forms;
namespace ArLi.CommonPrj {
public class ShowAboutBox {
public static void ShowOn(Form fm) {
MessageBox.Show("OK");
}
}
}
編譯後檔案名稱叫 AboutBox.dll
主程式裡調用方法如下:
//定義檔案名稱
FileInfo aBoxFile = new FileInfo(Path.Combine(Application.StartupPath,"AboutBox.dll"));
if (aBoxFile.Exists) { //如果存在
try { //預防意外,比如不載不完整,非法DLL
// 開始載入
Assembly aBox = Assembly.LoadFrom(aBoxFile.FullName);
Type[] _t = aBox.GetTypes(); //獲得全部Type
foreach (Type t in _t) { //遍曆
//如果發現名稱空間和類名有相符的
if (t.Namespace == "ArLi.CommonPrj" && t.Name == "ShowAboutBox") {
//載入方法
MethodInfo m = t.GetMethod("ShowOn");
if (m != null) { //如果要載入的方法存在
//建立執行個體
object o = Activator.CreateInstance(t);
//執行該方法,後面的this 是參數
m.Invoke(o,new object[]{this});
}
else { //載入的方法不存在
MessageBox.Show("File /"AboutBox.dll/" Invalid!/n/nMethod Error.");
}
return;
}
}
MessageBox.Show("File /"AboutBox.dll/" Invalid!/n/nAssembly Name Error.");
} //檔案、命名空間、方法都相符,但執行該DLL 內容出錯
catch (System.NullReferenceException ex) {
MessageBox.Show("File /"AboutBox.dll/" Invalid!");
} //檔案非正常DLL
catch (Exception ex) {
MessageBox.Show("File /"AboutBox.dll/" Error: /n/n" + ex.Message);
}
}
else { //檔案沒找到
MessageBox.Show("File /"AboutBox.dll/" Missing!");
}
說明1: 如果直接用 type t = gettype("arli.comm...") 這樣也可以但如果此class 不存在就會出Exception
說明2:這種逆向反射動態載入無需定義裝配件資訊
說明3:此方法已經最大程度的進行了潛在的檢測,除非非合法的WinDLL(比如下載的不完整),否則不會進入到很慢的 try catch