我在服务端程序中,要用到反射,
例如:有一个Server.dll,
FileInfo file = new FileInfo("Server.dll");
Assembly ass = Assembly.LoadFrom(file.FullName);
MyTypea = ass.GetType(className);
……
现在我要升级,要用新版本的Server.dll替换原来的,提示,原来的文件在正在被使用,
不能被覆盖
必须要停掉服务才能替换,那样很不方便,也不能容忍。后来我想到了另外一个方法
private static string FileName = "Server.dll";
……
我用方法SetFileFileName("Server0.dll");
把 FileName 的值改了,
FileInfo file = new FileInfo(FileName);
Assembly ass = Assembly.LoadFrom(file.FullName);
MyTypea = ass.GetType(className);
这样就可以升级了,不停服务升级的问题就解决了。
现在新问题又出来,Server.dll 删除不掉,提示说正在被使用??
我已经不用那个Server.dll文件了呀,现在使用的是Server0.dll了,
这是怎么回事??
这样我每升一次级,就会留下一个文件,这样不好吧,
有什么方法可以删除那个不用的文件吗??

解决方案 »

  1.   

    http://www.cnblogs.com/wayfarer/archive/2005/03/31/47896.html
      

  2.   

    我以前都遇过这样的问题,我的做法是在加载时把DLL复制另一个临时文件,再调用它,下次更新时就可以覆盖它了,并又复制一个新一临时,结束时再删掉这些临时文件
      

  3.   

    Flashcom(虫虫) 
    老兄,你是怎们删除临时文件的?
    我现在的方法跟你差不多,就是没办法删除过期文件
      

  4.   

    应该要创建一个AppDomain,在该AppDomain中做发射的事情。
    如果不需要了,则卸载该AppDomain.
      

  5.   

    Lostinet(每晚 8:00 见) 
    我用
    http://www.cnblogs.com/wayfarer/archive/2005/03/31/47896.html
    中的方法加载不了呀?
      

  6.   

    用域加载可以 
    不过跨域,子可以传递可以序列化的类 web 里的很多类用不了。Assembly.Load(byte[]) 
    第一个参数是你要加载的dll 的 byte 数组
    这个方法可以加载后覆盖原始文件
    不过 编程的时候好像没法调试这个好像可以调试,不过没试验过(第2个参赛可能是调试用的 .pdb 文件的 byte[])
    [C#]
    public static Assembly Load(
       byte[] rawAssembly,
       byte[] rawSymbolStore
    );
      

  7.   

    我用
    http://www.cnblogs.com/wayfarer/archive/2005/03/31/47896.html
    中的方法加载不了呀?
    但是如果加载她自己的那个类,就行,
    加载我的,就提示反序列化信息不足
    郁闷