读书人

炸弹是怎样爆炸的-动态装卸DLL,该怎么

发布时间: 2012-03-19 22:03:05 作者: rapoo

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


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

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


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

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


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

C# code
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会自动消失。



Assembly code
Press Any Key To Exit ...bo~~~


如果把ClassLibrary1.dll改为

C# code
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将会输出

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



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


[解决办法]
这个帖子会火~
[解决办法]
接分~~
[解决办法]
Mark~ 等下班了再慢慢看
[解决办法]
。。好玩
[解决办法]
亮点
[解决办法]
为什么不在MAIN中拖一个线程出来?
[解决办法]
System.Runtime.Remoting.ObjectHandle ...这个

学习了
[解决办法]
剪剪又出新东东了。。。膜拜下。。
[解决办法]
up
[解决办法]

一定会爆炸滴
[解决办法]
学习新东西。。。

*****************************************************************************
欢迎使用CSDN论坛专用阅读器 : CSDN Reader(附全部源代码)

http://feiyun0112.cnblogs.com/
[解决办法]
路过!学到东西了!
[解决办法]
不知到这个有什么意思?
请高人教我。
[解决办法]
学习
[解决办法]
学习
[解决办法]

[解决办法]
老大的东西要顶 一定要顶的寂寞
[解决办法]
向高手,学习
[解决办法]
楼主太强大了!!
[解决办法]
什么?老流氓级别真高。
JF
[解决办法]
有创意。。什么时候加个拆弹组进去
[解决办法]

[解决办法]
学习
------解决方案--------------------


看看牛人
[解决办法]
Assembly assembly = Assembly.LoadFrom(fileName);

讨厌的LoadFile
Dll里引用的找不到..
[解决办法]
顶一个。
[解决办法]
有创意
[解决办法]
此贴必火,有意思!!!
[解决办法]
.
[解决办法]
up
[解决办法]
留名,此贴有火的趋势
[解决办法]
学习
[解决办法]
Learning...
[解决办法]
该贴必爆
[解决办法]
多AppDomain的程序,呵呵
[解决办法]

[解决办法]
强!
[解决办法]
此贴必火,火前留名.


我妄自揣测一下大虾的意图,是要示范一下如何在一个正在运行的系统中动态加载一个新的类.而实现软件的"热插拨"式的更新.这在不允许中断的系统中比较重要.
[解决办法]
慢慢研究和学习!
[解决办法]
好长的代码~
[解决办法]
好长的代码~慢慢研究和学习!
[解决办法]
学习中......
[解决办法]
果然比较雷人!
[解决办法]
JJ
有意思

[解决办法]
mark 顶完再看
[解决办法]
尽是高手!
[解决办法]
不懂,接分
[解决办法]
炸!
[解决办法]
太强大了!!!
[解决办法]
雷人
[解决办法]
有意思,雷人的
[解决办法]
看高手解释
[解决办法]
有意思 ~~~~!
有意思啊 ~~~~!
顶起。。。。。。
不会吧系统炸蹦了吧~~~~~!!!!!!!!!!
[解决办法]
有意思 坐下学习
[解决办法]
学习
[解决办法]
赞一个。。。
[解决办法]
好贴


[解决办法]
呵呵~好!
[解决办法]
assembly这玩艺可是请神容易送神难

这话说到俺心里去了...
[解决办法]
好象很有意思,暂时没看懂,先留个脚印!
[解决办法]
真生猛。
[解决办法]
ding
[解决办法]
GAME
[解决办法]
进来学习来了
[解决办法]
有创意。。什么时候加个拆弹组进去

哈哈....

[解决办法]
楼主很牛,虚心学习!
[解决办法]
mark
[解决办法]
路过!学到东西了!
[解决办法]
学习了
[解决办法]
学习学习,谢谢分享!
[解决办法]
反射,做过
[解决办法]
好贴,mark
[解决办法]
虽然看不懂,但隐约觉得有意思。顶一个。
[解决办法]
没看懂。
[解决办法]
膜拜
[解决办法]
呵呵,有意思
[解决办法]
有趣的东西~~~
[解决办法]
这个帖子会火~
[解决办法]
good style:)
[解决办法]
mark
[解决办法]
学习了
[解决办法]
学习
[解决办法]
学习
[解决办法]
刚刚运行试了下,我的LCD被炸了个洞……
[解决办法]
jinjazz的例子稍显复杂,
小弟不才,
斗胆给一个以前用过项目中的简化案例,
为了控制进程间通讯,实际情况要复杂的多:

C# code
namespace MyAddin{    public interface IAddin    {        void PrintName();    }}
[解决办法]
Mark!
[解决办法]
我是学习、参观的,我可不想自己来运行一下,我的显示器就这么大点地方还不是很结实,哪能受得了炸啊~~
[解决办法]
学习了
[解决办法]
学习了
------解决方案--------------------


有意思..回家慢慢去看去..
[解决办法]
学习
[解决办法]
有意思,好玩
[解决办法]
study
[解决办法]
剪刀大侠,感谢。希望你能继续出些小技术,小应用的帖子出来,知识贴

读书人网 >.NET

热点推荐