本人不想使用一个程序调用另一个,想用一个程序动态加载DLL,当有更新,关闭线程,更新dll及配置文件,然后启动

解决方案 »

  1.   

    Assembly.load 可以加载,不过好像没卸载的方法
      

  2.   

    .net加載的是副本,正在使用的照样可以替换,替换好再加载遍不就好了
      

  3.   

    貌似不行,我需要替换DLL,但那个时候可能垃圾处理器还没有回收。
      

  4.   


    同一个名称的Assembly,内存中可以有多个。比如说你有一个 ABC类型对象,现在你加载了这个dll的另外一个版本的dll,反射创建了另外一个ABC对象,那么内存中就有两个ABC对象实例,它们来自于不同的dll。在.net中是完全允许的。不用等GC回收第一个对象。你可以自己编写程序试一下。事实上,就算你没有更新dll版本,你把同一个dll使用代码加载两遍,得到两个Assembly内存对象,使用这个分别反射创建ABC对象实例,然后你判断它们的类型,你会发现他们的类型也是不同的。也就是说“ABC类型并不等于ABC类型”,因为它们来自于内存中不同的Assembly。
      

  5.   

    因此来说,你只要把原来的dll拷贝到一个临时目录里运行就可以了。然后更新dll之后再次包背到新的临时目录里加载运行,无需去考虑什么“关闭线程”这种概念,也无需等待GC回收什么对象。
      

  6.   

    把DLL加载到单独的APPDomain中,然后卸载AppDomain.
      

  7.   

    如果这样,貌似就不用动态加载了吧,先运行,新的dll放在临时文件,更新后重新运行程序,判断临时文件是否有,有的话先覆盖DLL,然后在加载dll