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

时间:2010-06-14 12:59:45

标签: c#

我有一个在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文件更新后(我通过查看文件属性和检查文件版本手动验证),GetProductVersion仍然返回旧文件版本,我不明白为什么!任何帮助是极大的赞赏。我正在使用.Net 3.5运行Windows Vista。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

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