创建新AppMain 加载Assembly,执行Interface

接口定义--编译为Interface.dll 供炸弹和土匪引用。

  1. using  System;  
  2. namespace  Interface  
  3. {  
  4.     public   interface  IBomb  
  5.     {  
  6.         void  Explode();  
  7.     }  
  8. }  


 

炸弹定义--编译为ClassLibrary1.dll,准备交给土匪

  1. using  System;  
  2. namespace  ClassLibrary1  
  3. {  
  4.     public   class  Class1:Interface.IBomb  
  5.     {  
  6.         public   void  Explode()  
  7.         {  
  8.             Console.WriteLine("bo~~~" );  
  9.         }  
  10.     }  
  11. }  




那么程序A,引爆炸弹而且能把炸弹扔掉的土匪--编译为AppDomainTest.exe

  1. using  System;  
  2. using  System.Reflection;  
  3. namespace  AppDomainTest  
  4. {  
  5.     /// <summary>   
  6.     /// 动态装卸dll程序集示例   
  7.     /// 这里用一个有趣的例子:   
  8.     ///    
  9.     /// 我把一个dll看作是炸弹,执行如下操作   
  10.     /// 1、炸弹扔到程序运行目录中   
  11.     /// 2、引爆炸弹   
  12.     /// 3、炸弹消失   
  13.     ///    
  14.     ///    
  15.     /// </summary>   
  16.     class  Program  
  17.     {  
  18.         /// <summary>   
  19.         /// 使用FileSystemWatcher监视炸弹,如果有则引爆   
  20.         /// </summary>   
  21.         /// <param name="args"></param>   
  22.         static   void  Main( string [] args)  
  23.         {  
  24.             Console.WriteLine("Press Any Key To Exit ..." );  
  25.             System.IO.FileSystemWatcher fsWatcher = new  System.IO.FileSystemWatcher();  
  26.             fsWatcher.Path =System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);  
  27.             fsWatcher.Filter = "*.dll" ;  
  28.             fsWatcher.EnableRaisingEvents = true ;  
  29.             fsWatcher.Created += new  System.IO.FileSystemEventHandler(fsWatcher_Created);  
  30.             Console.ReadKey();  
  31.         }  
  32.         /// <summary>   
  33.         /// 如果有炸弹丢过来则引爆   
  34.         /// </summary>   
  35.         /// <param name="sender"></param>   
  36.         /// <param name="e"></param>   
  37.         static   void  fsWatcher_Created( object  sender, System.IO.FileSystemEventArgs e)  
  38.         {  
  39.             InvokeExplode(e.FullPath);  
  40.         }  
  41.         /// <summary>   
  42.         /// 不能炸着自己,创建一个AppDomain...   
  43.         /// </summary>   
  44.         /// <param name="fileName"></param>   
  45.         public   static   void  InvokeExplode( string  fileName)  
  46.         {  
  47.             try   
  48.             {  
  49.                 System.AppDomain app = System.AppDomain.CreateDomain(System.IO.Path.GetFileNameWithoutExtension(fileName));  
  50.                 System.Runtime.Remoting.ObjectHandle objLoader=  
  51.                     app.CreateComInstanceFrom(System.Reflection.Assembly.GetExecutingAssembly().Location, "AppDomainTest.RemoteLoader" );  
  52.                 RemoteLoader loader = objLoader.Unwrap() as  RemoteLoader;  
  53.                 loader.InvokeExplode(fileName);  
  54.                 System.AppDomain.Unload(app);  
  55.                 System.IO.File.Delete(fileName);  
  56.             }  
  57.             catch  (Exception ex)  
  58.             {  
  59.                 Console.WriteLine(ex.Message);  
  60.             }  
  61.         }  
  62.     }  
  63.     /// <summary>   
  64.     /// 在这里爆炸,注意这里的Assembly不能被外面访问   
  65.     /// </summary>   
  66.     class  RemoteLoader : MarshalByRefObject  
  67.     {  
  68.         public   void  InvokeExplode( string  fileName)  
  69.         {  
  70.             Assembly assembly = Assembly.LoadFile(fileName);  
  71.             foreach  (System.Type type  in  assembly.GetTypes())  
  72.             {  
  73.                 if  (type.GetInterface( typeof (Interface.IBomb).FullName) !=  null )  
  74.                 {  
  75.                     object  obj = assembly.CreateInstance(type.FullName, true );  
  76.                     ((Interface.IBomb)obj).Explode();  
  77.                 }  
  78.             }  
  79.         }  
  80.     }  
  81.        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值