2010-06-14 36 views
3

我有一个程序在c#中执行,有时通过将exe交换到新的程序来更新。我希望程序定期检查它是否已更新,如果有,请重新启动。我使用下面的函数来做到这一点。当程序开始是使用GetProductVersion(exe_name)当前版本FileVersionInfo.GetVersionInfo获取旧版本的exe在运行时交换

exe_name被设置为正在更新的可执行文件的名称

public static bool DoINeedToRestart(string exe_name) 
    { 

     Version cur_version = new Version(MainProgram.StartVersion); 
     Version file_version = new Version(GetProductVersion(exe_name)); 
     MessageBox.Show("Comparing cur_version " + cur_version.ToString() + " with " + file_version.ToString()); 
     if (file_version > cur_version) 
     { 
      return true; 
     } 
     return false; 
    } 

    public static string GetProductVersion(string path_name) 
    { 
      FileVersionInfo myFI = FileVersionInfo.GetVersionInfo(path_name); 
      return myFI.FileVersion; 
    } 

MainProgram.StartVersion设置。

我有的问题是一旦MainProgram.exe文件已经更新(我通过查看文件属性并检查文件版本来手动验证),GetProductVersion仍然返回旧的文件版本,我不知道为什么!任何帮助是极大的赞赏。我使用.Net 3.5运行Windows Vista。

回答

1

什么操作系统?如果这是Windows,那么我担心你错误地交换正在执行的.exe文件 - 所有正在运行的程序都被Windows内核中的虚拟内存管理器锁定。完全可能的是,您有一些.NET库在后台执行重定向,使其看起来好像新文件已就位,但只有通过该库的文件访问才会受到影响。

编辑:据我所知,Windows拒绝企图删除或重命名不仅映射到内存,但也是所有父目录的可执行文件。由于您使用的是Vista,所以实际上您可能会看到外观的影响 - 对于非管理员程序,Windows将重定向写入操作,然后将Windows和Program Files目录读取到每个用户的虚拟区域。如果您通过任何非提升手段启动该程序,则可能实际上正在虚拟区域中运行该应用程序的副本。安装程序服务(MSIEXEC)以完全提升的管理权限运行,因此它不受重定向的影响。因此,我认为Windows安装程序会覆盖C:\ Program Files \中的版本,而您的应用程序会从%USERPROFILE%\ AppData \ Local \ VirtualStore \ Program Files \任何覆盖层中看到版本,该版本保持不变。通常情况下,如果“真实”目录中的版本发生变化,它将具有比覆盖版本更新的修改时间,因此将使用“真实”版本。但是,如果安装过程保留了修改时间,那么覆盖层可能会有更近的时间并继续使用。

+0

嗨,本。它运行在Windows Vista(.NET 3.5)上。我知道加载到内核中的程序无法交换,但它看起来好像文件系统上的.exe文件可以。我似乎可以删除它或重命名它而不影响程序的运行。这是否意味着即使在删除它之后,正在运行的程序仍会将其视为在那里? – 2010-06-14 13:39:24

+0

道歉本,但我需要纠正自己。我可以重命名正在运行的进程的.exe,但无法删除它们 - 我重新测试了几次。 Windows安装程序是什么更新文件,似乎能够删除旧版本,并把新的(通过资源管理器查看时)。正如你所说,这可能是一个façade。 – 2010-06-14 13:56:08

+0

这很有趣。你是如何开始这个计划的,路径是什么?我在回答中添加了更多信息,因为评论太长。 – 2010-06-15 00:05:05

1

我想一些缓存是在幕后发生的。

为什么不避开这个问题,只需创建一个名为restart.txt的空文本文档,并在文件存在时重新启动?

+0

感谢您的建议 - 这可能是我最终要做的。我也很好奇知道幕后发生了什么。 – 2010-06-14 13:26:39