本帖最后由 opika 于 2010-08-14 17:09:01 编辑

解决方案 »

  1.   

    自动更新,根本用不着另外一个软件,自己升级自己就可以了。下载到同名目录下,下载完成后,组合一个bat文件,循环检测自己文件,发现可以删除了。就删除掉。吧下载的文件更名为主程序名,然后运行主程序启动。自升级结束,删除资深bat文件。这么简单的一个逻辑居然弄2个程序…
      

  2.   

    楼主言之有理,不过我还是更希望我提的问题能得到针对性解决哈~   谢谢,继续期待 高手 ing~~~
      

  3.   

    你的太长。没格式,没仔细看。给你个模拟的范例。一个函数就可以自己实现自我更新,你可以新建一个控制台程序,然后粘贴如下代码,添加对应的引用。就可以了。
    [STAThread]
    static void Main(string[] args)
    {
        //选择一个文件,进行更新,模拟一下而已。实际对应你的下载过程
        OpenFileDialog dlg = new OpenFileDialog();
        dlg.Filter = "更新程序|*.exe||";
        if (dlg.ShowDialog() != DialogResult.OK) return;
        //缓存当前文件绝对路径
        string thisPath = Environment.GetCommandLineArgs()[0];
        //当前文件更名
        FileInfo fi = new FileInfo(thisPath);
        string tempFile = Regex.Replace(thisPath, @"(?i)(?=\.exe)", "1");
        if (File.Exists(tempFile)) File.Delete(tempFile);
        fi.MoveTo(tempFile);
        //下载的程序移动并更名为缓存的文件名
        File.Move(dlg.FileName,thisPath);
        //启动下载的程序
        Process.Start(thisPath);
        //退出自己,更新完毕
        Environment.Exit(0);
        Console.ReadKey();
    }
      

  4.   

    楼主遇到的问题 IO 操作过程中常见错误:在文件句柄没有被释放的情况下操作该文件,所以系统会报错(进程无法访问文件,因为该文件正由另一个进程占用)。分析一下问题的症结所在:你的主程序在运行中(尽管你已经 Kill 了,但可能你的程序还在运行),此时你尝试覆盖正在运行的可执行文件自然行不通。
      

  5.   

    通过程序得到需要升级的需求。  
    关闭,并运行自编的软件,最后,得到这个软件,并覆盖软件。  
    最后,关闭自动升级软件,并运行软件。
    可使用web services和XML获取版本信息
    http://topic.csdn.net/u/20090813/16/1aaa85f4-afee-49a6-abfe-140259d59791.html
      

  6.   

    哈~~   谢谢各位的解答~~   问题已经解决~~原因是由于我在 更新程序 中通过
     Assembly.LoadFrom( 主程序绝对路径).GetName().Version.ToString() 
    的方式来获取主程序本地的版本,所以在替换时,出错那个错误,也就是因为老主程序正被 更新程序调用(通过上面那句代码)。 
    把上面那句代码去掉了,结果,就可以正常删除或覆盖了再次谢谢各位~结贴~~