FileVersionInfo.GetVersionInfo获取在运行时交换的旧版本的exe

我有一个在c#中执行的程序,有时在运行时通过将exe交换到新程序来更新。 我希望程序定期检查它是否已更新,如果是,请重新启动。 我使用以下函数来执行此操作。

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; } 

使用GetProductVersion(exe_name)将程序启动为当前版本时,将设置MainProgram.StartVersion

exe_name设置为要更新的可执行文件的名称。

我遇到的问题是一旦MainProgram.exe文件被更新(我通过查看文件属性和检查文件版本手动validation),GetProductVersion仍然返回旧文件版本,我不明白为什么! 任何帮助是极大的赞赏。 我正在使用.Net 3.5运行Windows Vista。

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

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

我猜一些缓存正在幕后发生。

为什么不回避这个问题,只创建一个名为restart.txt的空文本文档,如果该文件存在则重新启动?