我有一个场景,一个用户可以安装应用程序更新,而另一个登录用户正在运行该应用程序。
当其他用户重新连接到他们的会话时,会调用FileVersionInfo.GetVersionInfo(file)
来检查是否发生了更新并且是否要重新启动应用程序。
但是,虽然文件资源管理器中的文件显示新版本号(同一版本用于文件和产品版本),但对GetVersionInfo()
的调用将返回当前正在执行的版本 - 而不是磁盘上的版本。
我只设置[assembly: AssemblyVersion("A.B.C.D")]
版本属性,并保留其他版本属性,使其默认为AssemblyVersion
值。
string file = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, AppDomain.CurrentDomain.FriendlyName);
/// or
string file = @"C:\Program Files (x86)\Company\Product\product.exe";
FileVersionInfo info = FileVersionInfo.GetVersionInfo(file);
info.FileVersion; /// returns 1.0.0.0
然而,文件资源管理器中product.exe
的文件版本(和产品版本)详细信息显示为2.0.0.0
。
我认为执行程序集必须引用某种虚拟化文件或VirtualStore
中的路径,因为文件系统已更改。
如何可靠地获取product.exe
目录中C:\Program Files (x86)\Company\Product
所显示的实际文件版本?
要重现此问题,请使用以下Console
应用程序:
using System;
using System.Diagnostics;
using System.IO;
namespace versiontest
{
class Program
{
static void Main(string[] args)
{
string file = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, AppDomain.CurrentDomain.FriendlyName);
Console.WriteLine("Getting FileVersion of {0}: {1}", file, FileVersionInfo.GetVersionInfo(file).FileVersion);
Console.WriteLine("Modify the file and press any key to continue...");
Console.ReadKey();
Console.WriteLine("Getting FileVersion of {0}: {1}", file, FileVersionInfo.GetVersionInfo(file).FileVersion);
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
}
}
}
构建应用程序的两个版本。第一个应该具有程序集版本属性,没有其他版本属性,在AssemblyInfo.cs
中设置为:
[assembly: AssemblyVersion("1.0.0.0")]
第二个应该将版本设置为
[assembly: AssemblyVersion("2.0.0.0")]
执行版本1.0.0.0
app.exe
,然后在检索到第一个文件版本后,将执行app.exe
重命名为app.exe.bak
并复制版本2.0.0.0
{ {1}}进入同一个文件夹。
当我这样做时,这是我的控制台输出:
app.exe
如果您立即再次运行Getting FileVersion of C:\Users\User\Documents\Company\Source\product\testapp\bin\x86\Debug\app.exe: 1.0.0.0
Modify the file and press any key to continue...
Getting FileVersion of C:\Users\User\Documents\Company\Source\product\testapp\bin\x86\Debug\app.exe: 1.0.0.0
Press any key to exit...
,作为版本app.exe
应用程序,控制台输出将显示:
2.0.0.0