gpt4 book ai didi

c# - FileVersionInfo.GetVersionInfo 在运行时交换旧版本的 exe

转载 作者:行者123 更新时间:2023-11-30 12:36:36 25 4
gpt4 key购买 nike

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

最佳答案

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

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

关于c# - FileVersionInfo.GetVersionInfo 在运行时交换旧版本的 exe,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3037365/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com