花了几个小时,得出的一个结论,在 .Net  2.0中,动态可插卸程序集几乎是不可能的。
  
  下面的链接中的文章说明了为什么程序集无法动态插卸
  http://www.devsource.com/article2/0,1895,1790388,00.asp

  简单的说,当AppDomainA 和 AppDomainB(加载程序集的域)发生交互时,一旦在AppDomainA的执行范围内存在 AppDomainB 所加载的 AssemblyC 的类型或对象,那么AppDomainA就会自动加载 AssemblyC到 AppDomainA中。这是因为 AssemblyC 的对象跨 AppDomain 传递需要反序列化,而反序列化必须从 AssemblyC 中取得类型的信息。

 而我们所见到使用 ShadowCopy 的方法动态装卸程序集是不真实的,原本使用的程序集只是被拷贝了一份放到了 AppDomain.AppDomainSetup.ShadowCopyDirectories 这个目录之中,程序中使用的就是这份程序集;因此 ShadowCopy 的唯一作用就是在运行是动态替换执行文件而已。

  通过反复的实验,得出一个结论,只有子域单向调用父域时,才不会导致程序集的在父域的自动加载,而一旦在父域中出现子域动态加载的程序集中的类型或对象时,CLR会自动加载该程序集。

  试问,有多少情况父域不需要接触子域中定义的对象类型?
  上面给出的文章的作者采用的方式是,创建两个 AppDomain,完成任务时一起销毁。


以下是实验代码:
   == Download ==

  Loader.cs 的第一行为预处理器 #define CAN_DELETE
  在这种情况下运行程序可以删除掉加载的程序集。
  删除 #define CAN_DELETE 或修改为 #undef CAN_DELETE 则会无法删除该程序集。


其他相关链接:
http://www.cnblogs.com/wayfarer/archive/2004/09/29/47896.html
http://www.microsoft.com/china/msdn/archives/library/dncscol/html/csharp05162002.asp
posted on 2007-03-08 03:17  Zealic  阅读(3549)  评论(18编辑  收藏  举报