我有一个部署到两个不同位置的Windows窗体应用程序。
- 内联网-单击一次
- 互联网-通过Windows安装程序安装在citrix场中
我显示单击一次部署版本ApplicationDeployment.IsNetworkDeployed
的ClickOnce版本号。
if (ApplicationDeployment.IsNetworkDeployed)
return ApplicationDeployment.CurrentDeployment.CurrentVersion;
但是对于非click应用程序,我不确定如何检索clickonce版本,除非我在程序集信息中硬编码版本号。
是否有自动检索非clickonce部署版本的ClickOnce版本号的方法?
9条答案
按热度按时间yb3bgrhw1#
1.* * 将对
System.Deployment
的程序集引用添加到项目中。**1.* * 导入类文件中的命名空间:**
VB.NET:
C编号:
1.* * 从
CurrentVersion
属性检索ClickOnce版本。**可以从
ApplicationDeployment.CurrentDeployment.CurrentVersion
属性获取当前版本。此属性返回System.Version
对象。注意(来自MSDN):
Restart
,则CurrentVersion
将不同于UpdatedVersion
。如果部署清单配置为执行自动更新,则可以比较这两个值以确定是否应重新启动应用程序。*注意:
CurrentDeployment
静态属性仅在使用ClickOnce部署应用程序时有效。因此,在访问此属性之前,应首先检查ApplicationDeployment.IsNetworkDeployed
属性。它在调试环境中将始终返回false。VB.NET:
C编号:
1.* * 使用
Version
对象:**从这里开始,您可以使用标签中的版本信息,例如在"关于"表单中,方法如下:
VB.NET:
C编号:
(
Version
对象被格式化为由四部分组成的编号(主版本号、次版本号、内部版本号、修订版本号)。)gywdnpxw2#
不,我不认为有这样的方法。我认为ClickOnce信息来自清单,该清单仅在ClickOnce部署中可用。我认为硬编码版本号是最佳选择。
j5fpnvbx3#
我会简单地使主程序集的程序集版本与每次发布新版本时的ClickOnce版本相同,然后当它作为非clickonce应用程序运行时,只需使用反射来获取程序集版本。
rfbsl7qr4#
尝试线程验证:
6tqwzwtp5#
三年后这并不重要,但我最终只是用XML阅读器解析了清单文件。
qxgroojn6#
要扩展RobinDotNet的解决方案:
Protip:每次构建时,您可以从.csproj文件MSBuild配置中自动运行一个程序或脚本来完成这一任务。我为我目前维护的一个Web应用程序执行了这一操作,执行Cygwin bash shell脚本来执行一些版本控制h4 x,以从Git历史记录中计算版本号,然后预处理汇编信息源文件,编译成构建输出。
可以执行类似的操作,从项目文件中解析ClickOnce版本号,即
Project.PropertyGroup.ApplicationRevision
和Project.PropertyGroup.ApplicationVersion
(尽管我不知道版本字符串的意思,但您可以猜测,直到它损坏并修复它),并将该版本信息插入程序集信息中。**我不知道ClickOnce版本是什么时候升级的,但可能是在构建过程之后,所以您可能需要修改这个解决方案以编译新的数字。***我猜总是有
/*h4x*/ +1
*。我使用Cygwin是因为 *nix脚本比Windows好得多,而且解释代码可以省去 * 在构建之前构建预构建程序 * 的麻烦,但是您可以使用任何您想要的技术(包括C#/.NET)来编写程序。
你可以想象,这发生在构建阶段之前,因此您可以在编译之前有效地预处理您的源代码。我不想自动编辑
Properties\AssemblyInfo.cs
文件,因此为了安全起见,我创建了一个Properties\VersionInfo.base.cs
文件,其中包含一个带有版本信息的类的文本模板,并在项目设置中标记为BuildAction=None
,以便它不会“t与项目一起编译:(一个非常肮脏的,穷人的占位符语法类似于Windows的环境变量与一些额外的h4 x扔在使用简单的/复杂的缘故)
AssemblyRevisionIdentifierAttribute
是我创建来保存Git SHA1的自定义属性,因为它比 * a. b.c. d* 对开发人员更有意义。然后,
refresh-version
程序会将该文件复制到Properties\VersionInfo.cs
,然后替换已经计算/解析的版本信息(我使用sed(1)
进行替换,这是使用Cygwin的另一个好处).Properties\VersionInfo.cs
被编译到程序中。该文件开始时可能为空,您应该通过版本控制系统忽略它,因为它会自动更改,并且生成它的信息已经存储在其他位置。e3bfsja27#
硬编码或...跟踪数据库中的版本(文件、程序集、部署)。使用程序集调用数据库并获取部署版本。
这里假设你以一种逻辑的方式增加你的版本,这样每一个版本类型都有一个关系。对于这样一个小问题来说,这是一个很大的工作量。我个人倾向于Jared的解决方案;尽管我讨厌硬编码。
0md85ypi8#
使用构建组件,您可以从项目文件中读取单击一次版本,并将其自动写入程序集信息,以便两者同步。
s5a0g9ez9#
适用于.NET(Core)7及更高版本的解决方案
在.net Core上,可以从环境变量
ClickOnce_CurrentVersion
读取版本号。参见documentation