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


版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。