装载外部DLL全攻略
ArLi2003(原作) 关键字 装载外部DLL,Assembly,Type,反射,装配件
例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