C#动态加载DLL(反射学习(二))

/*主要说明如何通过反射实现动态加载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.以上是参考网上资料,但是标注不清楚,造成我一直无法调试成功,看样子注释还是很重要的!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值