您的位置:首页 > 编程语言 > C#

C#通过反射实现动态加载DLL

2011-06-09 13:32 846 查看
/*主要说明如何通过反射实现动态加载DLL,
* 因为.Net底层有自动回收机制,所以不需要考虑这个问题
* ADD by Brian 2008/01/21 参考MSDN
*/
using System;
using System.IO;
using System.Threading;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.Remoting;

namespace DynamicIncreaseDLL
{
#region
class DynamicLoadDLL
{
[STAThread]
static void Main(string[] args)
{
string sCallDomainName = Thread.GetDomain().FriendlyName;
Console.WriteLine(sCallDomainName);
//创建一个动态程序域
Console.WriteLine("请输入动态程序域名称");
string sAD = Console.ReadLine();
AppDomain ad = AppDomain.CreateDomain(sAD);
//实例化一个ProxyObject这个类型的对象 这个是需要加载DLL的对象
ProxyObject obj = (ProxyObject)ad.CreateInstanceAndUnwrap("DynamicIncreaseDLL", "DynamicIncreaseDLL.ProxyObject");
//自己抓一个需要动态加载的DLL的文件名(包含文件路径)
string sFileName = Environment.CurrentDirectory + "//" + "gmrbrian.exe";
obj.LoadAssembly(sFileName);
obj.Invoke("类名", "构造方法名", "主程序方法参数");
AppDomain.Unload(ad);
obj = null;
Console.ReadLine();
}
}

class ProxyObject : MarshalByRefObject
{
Assembly asbly = null;
//加载包含路径的文件
public void LoadAssembly(string AFileName)
{
asbly = Assembly.LoadFile(AFileName);
}
//实例化该类
public bool Invoke(string AFullClassName, string AMethodName, params Object[] args)
{
if (asbly == null)
return false;
//获取该类的类型
Type tp = asbly.GetType(AFullClassName);
if (tp == null)
return false;
//获取该类的构造方法
MethodInfo mInfo = tp.GetMethod(AMethodName);
if (mInfo == null)
return false;
//实例化该类
Object obj = Activator.CreateInstance(tp);
//激活该对象
mInfo.Invoke(obj, args);
return true;
}
}
#endregion

}

注意:
1. 要想让一个对象能够穿过AppDomain边界,必须要继承MarshalByRefObject类,否则无法被其他AppDomain使用。
2. 每个线程都有一个默认的AppDomain,可以通过Thread.GetDomain()来得到
3.以上是参考网上资料,但是标注不清楚,造成我一直无法调试成功,看样子注释还是很重要的!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: