炸弹是怎样爆炸的-动态装卸DLL
我来设计一个例子,我在D目录运行程序A(土匪)。然后望D目录丢文件(炸弹)过去,土匪判断该文件是否炸弹(包含实现了接口IBomb的类),如果是,则执行IBomb的Explode方法让炸弹爆炸,当然炸了以后就没有了,文件将被删除。
接口定义--编译为Interface.dll供炸弹和土匪引用。
using System;namespace Interface{ public interface IBomb { void Explode(); }}using System;namespace ClassLibrary1{ public class Class1:Interface.IBomb { public void Explode() { Console.WriteLine("bo~~~"); } }}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(); } } } } }
Press Any Key To Exit ...bo~~~
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("乒~~~~乓~~~"); } }}Press Any Key To Exit ...bo~~~bo~~~乒~~~~乓~~~
[解决办法]
呵呵~好!
[解决办法]
assembly这玩艺可是请神容易送神难
这话说到俺心里去了...
[解决办法]
好象很有意思,暂时没看懂,先留个脚印!
[解决办法]
真生猛。
[解决办法]
ding
[解决办法]
GAME
[解决办法]
进来学习来了
[解决办法]
有创意。。什么时候加个拆弹组进去
哈哈....
[解决办法]
楼主很牛,虚心学习!
[解决办法]
mark
[解决办法]
路过!学到东西了!
[解决办法]
学习了
[解决办法]
学习学习,谢谢分享!
[解决办法]
反射,做过
[解决办法]
好贴,mark
[解决办法]
虽然看不懂,但隐约觉得有意思。顶一个。
[解决办法]
没看懂。
[解决办法]
膜拜
[解决办法]
呵呵,有意思
[解决办法]
有趣的东西~~~
[解决办法]
这个帖子会火~
[解决办法]
good style:)
[解决办法]
mark
[解决办法]
学习了
[解决办法]
学习
[解决办法]
学习
[解决办法]
刚刚运行试了下,我的LCD被炸了个洞……
[解决办法]
jinjazz的例子稍显复杂,
小弟不才,
斗胆给一个以前用过项目中的简化案例,
为了控制进程间通讯,实际情况要复杂的多:
namespace MyAddin{ public interface IAddin { void PrintName(); }}
[解决办法]
Mark!
[解决办法]
我是学习、参观的,我可不想自己来运行一下,我的显示器就这么大点地方还不是很结实,哪能受得了炸啊~~
[解决办法]
学习了
[解决办法]
学习了
------解决方案--------------------
有意思..回家慢慢去看去..
[解决办法]
学习
[解决办法]
有意思,好玩
[解决办法]
study
[解决办法]
剪刀大侠,感谢。希望你能继续出些小技术,小应用的帖子出来,知识贴