.net 如何在Windows窗体上显示ClickOnce版本号

rsaldnfx  于 2023-02-01  发布在  .NET
关注(0)|答案(9)|浏览(199)

我有一个部署到两个不同位置的Windows窗体应用程序。

  • 内联网-单击一次
  • 互联网-通过Windows安装程序安装在citrix场中

我显示单击一次部署版本ApplicationDeployment.IsNetworkDeployed的ClickOnce版本号。

if (ApplicationDeployment.IsNetworkDeployed)
        return ApplicationDeployment.CurrentDeployment.CurrentVersion;

但是对于非click应用程序,我不确定如何检索clickonce版本,除非我在程序集信息中硬编码版本号。
是否有自动检索非clickonce部署版本的ClickOnce版本号的方法?

yb3bgrhw

yb3bgrhw1#

1.* * 将对System.Deployment的程序集引用添加到项目中。**
1.* * 导入类文件中的命名空间:**
VB.NET:

Imports System.Deployment.Application

C编号:

using System.Deployment.Application;

1.* * 从CurrentVersion属性检索ClickOnce版本。**
可以从ApplicationDeployment.CurrentDeployment.CurrentVersion属性获取当前版本。此属性返回System.Version对象。
注意(来自MSDN):

  • 如果已安装新的更新但尚未调用Restart,则CurrentVersion将不同于UpdatedVersion。如果部署清单配置为执行自动更新,则可以比较这两个值以确定是否应重新启动应用程序。*

注意:CurrentDeployment静态属性仅在使用ClickOnce部署应用程序时有效。因此,在访问此属性之前,应首先检查ApplicationDeployment.IsNetworkDeployed属性。它在调试环境中将始终返回false。
VB.NET:

Dim myVersion as Version

If ApplicationDeployment.IsNetworkDeployed Then
   myVersion = ApplicationDeployment.CurrentDeployment.CurrentVersion
End If

C编号:

Version myVersion;

if (ApplicationDeployment.IsNetworkDeployed)
   myVersion = ApplicationDeployment.CurrentDeployment.CurrentVersion;

1.* * 使用Version对象:**
从这里开始,您可以使用标签中的版本信息,例如在"关于"表单中,方法如下:
VB.NET:

versionLabel.Text = String.Concat("ClickOnce published Version: v", myVersion)

C编号:

versionLabel.Text = string.Concat("ClickOnce published Version: v", myVersion);

Version对象被格式化为由四部分组成的编号(主版本号、次版本号、内部版本号、修订版本号)。)

gywdnpxw

gywdnpxw2#

不,我不认为有这样的方法。我认为ClickOnce信息来自清单,该清单仅在ClickOnce部署中可用。我认为硬编码版本号是最佳选择。

j5fpnvbx

j5fpnvbx3#

我会简单地使主程序集的程序集版本与每次发布新版本时的ClickOnce版本相同,然后当它作为非clickonce应用程序运行时,只需使用反射来获取程序集版本。

rfbsl7qr

rfbsl7qr4#

尝试线程验证:

if (ApplicationDeployment.IsNetworkDeployed)
{
    if (ApplicationDeployment.CurrentDeployment.CurrentVersion != ApplicationDeployment.CurrentDeployment.UpdatedVersion)
    {
        Application.ExitThread();
        Application.Restart();
    }
}
6tqwzwtp

6tqwzwtp5#

三年后这并不重要,但我最终只是用XML阅读器解析了清单文件。

qxgroojn

qxgroojn6#

要扩展RobinDotNet的解决方案:
Protip:每次构建时,您可以从.csproj文件MSBuild配置中自动运行一个程序或脚本来完成这一任务。我为我目前维护的一个Web应用程序执行了这一操作,执行Cygwin bash shell脚本来执行一些版本控制h4 x,以从Git历史记录中计算版本号,然后预处理汇编信息源文件,编译成构建输出。
可以执行类似的操作,从项目文件中解析ClickOnce版本号,即Project.PropertyGroup.ApplicationRevisionProject.PropertyGroup.ApplicationVersion(尽管我不知道版本字符串的意思,但您可以猜测,直到它损坏并修复它),并将该版本信息插入程序集信息中。

**我不知道ClickOnce版本是什么时候升级的,但可能是在构建过程之后,所以您可能需要修改这个解决方案以编译新的数字。***我猜总是有/*h4x*/ +1 *。

我使用Cygwin是因为 *nix脚本比Windows好得多,而且解释代码可以省去 * 在构建之前构建预构建程序 * 的麻烦,但是您可以使用任何您想要的技术(包括C#/.NET)来编写程序。

<PropertyGroup>
  <PreBuildEvent>
    $(CYGWIN_ROOT)bin\bash.exe --login -c refresh-version
  </PreBuildEvent>
</PropertyGroup>

你可以想象,这发生在构建阶段之前,因此您可以在编译之前有效地预处理您的源代码。我不想自动编辑Properties\AssemblyInfo.cs文件,因此为了安全起见,我创建了一个Properties\VersionInfo.base.cs文件,其中包含一个带有版本信息的类的文本模板,并在项目设置中标记为BuildAction=None,以便它不会“t与项目一起编译:

using System.Reflection;
using EngiCan.Common.Properties;

[assembly: AssemblyVersion("0.$REVNUM_DIV(100)$.$REVNUM_MOD(100)$.$DIRTY$")]
[assembly: AssemblyRevisionIdentifier("$REVID$")]

(一个非常肮脏的,穷人的占位符语法类似于Windows的环境变量与一些额外的h4 x扔在使用简单的/复杂的缘故)
AssemblyRevisionIdentifierAttribute是我创建来保存Git SHA1的自定义属性,因为它比 * a. b.c. d* 对开发人员更有意义。
然后,refresh-version程序会将该文件复制到Properties\VersionInfo.cs,然后替换已经计算/解析的版本信息(我使用sed(1)进行替换,这是使用Cygwin的另一个好处). Properties\VersionInfo.cs被编译到程序中。该文件开始时可能为空,您应该通过版本控制系统忽略它,因为它会自动更改,并且生成它的信息已经存储在其他位置。

e3bfsja2

e3bfsja27#

硬编码或...跟踪数据库中的版本(文件、程序集、部署)。使用程序集调用数据库并获取部署版本。
这里假设你以一种逻辑的方式增加你的版本,这样每一个版本类型都有一个关系。对于这样一个小问题来说,这是一个很大的工作量。我个人倾向于Jared的解决方案;尽管我讨厌硬编码。

0md85ypi

0md85ypi8#

使用构建组件,您可以从项目文件中读取单击一次版本,并将其自动写入程序集信息,以便两者同步。

s5a0g9ez

s5a0g9ez9#

适用于.NET(Core)7及更高版本的解决方案

在.net Core上,可以从环境变量ClickOnce_CurrentVersion读取版本号。

string versionString = Environment.GetEnvironmentVariable("ClickOnce_CurrentVersion") ?? "0.0.0.0";
Version version= Version.Parse(versionString);
MessageBox.Show(version.ToString());

参见documentation

相关问题