当前位置: 首页 > news >正文

动态装卸DLL示例-匪徒和

我来设计一个例子,我在D目录运行程序A(土匪)。然后望D目录丢文件()过去,土匪判断该文件是否(包含实现了接口IBomb的类),如果是,则执行IBomb的Explode方法让爆炸,当然炸了以后就没有了,文件将被删除。




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

using System; namespace Interface { public interface IBomb { void Explode(); } }




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

using System; namespace ClassLibrary1 { public class Class1:Interface.IBomb { public void Explode() { Console.WriteLine("bo~~~"); } } }




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

using System; using System.Reflection; namespace AppDomainTest { /// <summary> /// 动态装卸dll程序集示例 /// 这里用一个有趣的例子: /// /// 我把一个dll看作是,执行如下操作 /// 1、扔到程序运行目录中 /// 2、引爆 /// 3、消失 /// /// /// </summary> class Program { /// <summary> /// 使用FileSystemWatcher监视,如果有则引爆 /// </summary> /// <param name="args"></param> static void Main(string[] args) { Console.WriteLine("Press Any Key To Exit ..."); System.IO.FileSystemWatcher fsWatcher = new System.IO.FileSystemWatcher(); fsWatcher.Path =System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location); fsWatcher.Filter = "*.dll"; fsWatcher.EnableRaisingEvents = true; fsWatcher.Created += new System.IO.FileSystemEventHandler(fsWatcher_Created); Console.ReadKey(); } /// <summary> /// 如果有丢过来则引爆 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> static void fsWatcher_Created(object sender, System.IO.FileSystemEventArgs e) { InvokeExplode(e.FullPath); } /// <summary> /// 不能炸着自己,创建一个AppDomain... /// </summary> /// <param name="fileName"></param> public static void InvokeExplode(string fileName) { try { System.AppDomain app = System.AppDomain.CreateDomain(System.IO.Path.GetFileNameWithoutExtension(fileName)); System.Runtime.Remoting.ObjectHandle objLoader= app.CreateComInstanceFrom(System.Reflection.Assembly.GetExecutingAssembly().Location, "AppDomainTest.RemoteLoader"); RemoteLoader loader = objLoader.Unwrap() as RemoteLoader; loader.InvokeExplode(fileName); System.AppDomain.Unload(app); System.IO.File.Delete(fileName); } catch (Exception ex) { Console.WriteLine(ex.Message); } } } /// <summary> /// 在这里爆炸,注意这里的Assembly不能被外面访问 /// </summary> class RemoteLoader : MarshalByRefObject { public void InvokeExplode(string fileName) { Assembly assembly = Assembly.LoadFile(fileName); foreach (System.Type type in assembly.GetTypes()) { if (type.GetInterface(typeof(Interface.IBomb).FullName) != null) { object obj = assembly.CreateInstance(type.FullName,true); ((Interface.IBomb)obj).Explode(); } } } } }



--这三个文件怎么玩儿呢?第一个不能玩儿,是给第二个和第三个引用的。

运行AppDomainTest.exe,然后把ClassLibrary1.dll扔到该运行目录。你应该看到如下输出之后ClassLibrary1.dll会自动消失。


  
Press Any Key To Exit .. bo~~~



如果把ClassLibrary1.dll改为

using System; namespace ClassLibrary1 { public class Class1:Interface.IBomb { public void Explode() { Console.WriteLine("bo~~~"); } } public class Class2 : Interface.IBomb { public void Explode() { Console.WriteLine("乒~~~~乓~~~"); } } }

扔到正在运行AppDomainTest.exe的目录中,AppDomainTest.exe将会输出


  
Press Any Key To Exit ...
bo~~~
bo~~~
乒~~~~乓~~~



感兴趣就玩玩吧,注意assembly这玩艺可是请神容易送神难:p

相关文章:

  • 一个困扰我一个多星期的Nebula3的BUG
  • [Python]—Linux Server 系统监控程序
  • .NET 4.0中使用内存映射文件实现进程通讯
  • 中国移动短信指令大全
  • SQLServer中的循环批处理
  • IT市场10大趋势!
  • 关于Oracel 10g http://ip:1158/em 的问题
  • 18句话入门SQLServer XML
  • 移动商务潜力无穷
  • 一道可以成为.NET面试“必杀题”的“简单问题”
  • Linux 简单的网络配置练习一
  • 解决Ubuntu 9.04 耳机有声音但外放无声问题
  • IPv4和IPv6比特转发率和包转发率的关系
  • [LeetCode]-Pascal's Triangle III 杨辉三角问题
  • 令狐冲和TCP/IP协议的第三层协议的关系
  • [ JavaScript ] 数据结构与算法 —— 链表
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • Angular 2 DI - IoC DI - 1
  • JavaScript异步流程控制的前世今生
  • nginx 配置多 域名 + 多 https
  • Node.js 新计划:使用 V8 snapshot 将启动速度提升 8 倍
  • Vue 动态创建 component
  • 关于使用markdown的方法(引自CSDN教程)
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • 微信小程序设置上一页数据
  • 原生JS动态加载JS、CSS文件及代码脚本
  • 转载:[译] 内容加速黑科技趣谈
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • (10)STL算法之搜索(二) 二分查找
  • (Oracle)SQL优化技巧(一):分页查询
  • (八)Spring源码解析:Spring MVC
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (力扣记录)1448. 统计二叉树中好节点的数目
  • (数据结构)顺序表的定义
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • (转) Android中ViewStub组件使用
  • .Family_物联网
  • .NET Framework 的 bug?try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃
  • .NET Framework杂记
  • .NET 跨平台图形库 SkiaSharp 基础应用
  • .NET处理HTTP请求
  • .Net的DataSet直接与SQL2005交互
  • :“Failed to access IIS metabase”解决方法
  • @EventListener注解使用说明
  • [ CTF ] WriteUp-2022年春秋杯网络安全联赛-冬季赛
  • [ 数据结构 - C++]红黑树RBTree
  • [1127]图形打印 sdutOJ
  • [4.9福建四校联考]
  • [android] 天气app布局练习
  • [APUE]进程关系(下)
  • [BUUCTF NewStarCTF 2023 公开赛道] week3 crypto/pwn