FileVersionInfo.GetVersionInfo在运行时获取旧版本的可执行文件

4

我有一个在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;
    }

当程序启动时,MainProgram.StartVersion被设置为当前版本,使用GetProductVersion(exe_name)函数进行获取。

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

我的问题是,一旦MainProgram.exe文件已经更新(通过手动查看文件属性和检查文件版本来验证),GetProductVersion仍然返回旧的文件版本,我不知道为什么!非常感谢任何帮助。我正在运行带有.Net 3.5的Windows Vista操作系统。

2个回答

1

我猜幕后发生了一些缓存。

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


谢谢你的建议 - 这可能是我最终会采取的方法。我也很好奇幕后发生了什么。 - probably at the beach

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

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


抱歉,Ben,但我需要更正自己。我可以重命名正在运行的进程的.exe文件,但无法删除它们 - 我已经重新测试了几次。Windows Installer是更新文件的程序,似乎能够删除旧版本并将新版本放入其中(在资源管理器中查看)。正如你所说,这可能只是一个幌子。 - probably at the beach
很有趣。你是如何启动程序的,路径是什么?我正在将额外的信息添加到我的答案中,因为它太长了,无法在评论中显示。 - Ben Voigt
此外,我对 FileVersionInfo 进行了反思,.NET 封装代码中似乎没有进行任何缓存。原生 API http://msdn.microsoft.com/en-us/library/ms647003(VS.85).aspx 也没有提到任何缓存。但是,如果存在 mui(多语言用户界面)文件,则会发生一些神奇的事情。 - Ben Voigt
你能检查一下是否存在 %USERPROFILE%\AppData\Local\VirtualStore\Program Files\MainApplication 目录吗? - Ben Voigt
我检查了目录,但并没有找到它。不过,你的问题让我思考并通过任务栏探索了这个过程——它似乎是从一个充满回滚文件(.rbf)的Config.msi目录中执行的。从这个页面https://blogs.msdn.com/b/windows_installer_team/archive/2005/09/19/470980.aspx可以看出,“所涉及的文件将被重命名并放置在Config.rbf文件夹中,在重新启动后将被删除”。因此,看起来我的文件在重启之前会被重命名,这还算不错。 - probably at the beach
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接