我有一个ClickOnce部署的应用程序,我正在使用它来检测第一次运行新部署时:
if (ApplicationDeployment.IsNetworkDeployed
&& ApplicationDeployment.CurrentDeployment.IsFirstRun)
{
// Display release notes so user knows what's new
}
在ClickOnce执行自动更新后,它似乎按预期工作。
但是当用户在安装站点上发布publish.htm并手动安装新版本时,它根本不起作用。有没有办法可靠地检测这两种情况?
编辑:我正在尝试解决的情况:有时用户会听到已发布更新并手动转到publish.htm以获取新版本,而不是启动应用程序并让ClickOnce处理升级。对于ClickOnce,这显然与首次安装无法区分。真的吗?
解决方案代码:我最终使用以下关键部分创建了一个ClickOnce帮助程序类:
public static bool IsFirstRun
{
get
{
if (!IsNetworkDeployed)
return false; // not applicable == bool default value
if (!File.Exists(VersionFileName))
return true;
return (GetLastRunVersion() != Version.ToString());
}
}
public static void StoreCurrentVersion()
{
File.WriteAllText(VersionFileName, Version.ToString());
}
public static string GetLastRunVersion()
{
using (var stream = File.OpenText(VersionFileName))
{
return stream.ReadToEnd();
}
}
public static string VersionFileName
{
get
{
StringBuilder filename = new StringBuilder(Files.LocalFilesPath);
if (!filename.ToString().EndsWith(@"\"))
filename.Append(@"\");
filename.Append(@"versioninfo.dat");
return filename.ToString();
}
}
在ClickOnce安装中添加一个名为justInstalled.txt(或其他内容)的额外文件。应用程序启动时该文件的Chedk。如果您发现它将其删除并运行任何代码,以便首次运行该部署。在下次部署/升级之前,该文件将一直缺失。
是的,为每个程序版本重置IsFirstRun ...
这是微软的除外:
只要用户从一个版本升级到下一个版本,就会重置此属性的值。如果只想在第一次运行任何版本的应用程序时执行操作,则需要执行其他测试,例如检查第一次创建的文件是否存在,或者使用Application存储标志设置。
或多或少的答案你质疑...
if (ApplicationDeployment.IsNetworkDeployed)
{
ApplicationDeployment deployment = ApplicationDeployment.CurrentDeployment;
if (deployment.IsFirstRun)
{
//Your Code Here....
}
}