日期:2014-05-17  浏览次数:21248 次

C# 软件更新在文件覆盖上出现问题
就是如何更新文件下载后,关闭主程序,拷贝文件到指定文件夹,然后在启动主程序。
如果不关闭主程序,直接覆盖以前dll文件发生异常-“文件被其他进程调用中,不能对其进行操作”

望高手解决

------解决方案--------------------
我最近也遇到了这个问题,最后解决办法就是通过启动另外一个程序用来关闭主程序所有进程,结束后将更新文件覆盖,最后重新启动主程序。
------解决方案--------------------
当运行一个exe文件的时候,系统用内存映射的方法把文件装入到用户程序的内存空间中(除非文件在软盘或CD等媒介上)。
被内存映射的文件是不能被删除的。但是,该文件可以被改名

因此我们可以将自身exe文件改名,将新版本拷贝为当前的名字,然后重新启动程序。

比如:)

private void button1_Click(object sender, EventArgs e)
{
    string exeFilename = Assembly.GetExecutingAssembly().Location;
    string tmpFilename = Path.GetTempPath() + Guid.NewGuid();
    File.Move(exeFilename, tmpFilename);
    File.Copy(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System), "calc.exe"), exeFilename);
    Application.Restart();
}}

------解决方案--------------------
我遇到这种情况的时候建立了两个exe文件,其中A只做为启动B使用,检查更新以及操作更新的部分做到A里面,更新是更新的B文件,更新成功后打开B,这样的话就不影响了。