例DLL 文件内容如下:
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 
|