更新ClickOnce应用程序而不会碰到版本号

时间:2016-08-28 21:10:11

标签: c# .net clickonce

我有一个ClickOnce应用程序在澳大利亚的各个州分发,并且根据本地机器,会出现错误。我需要找到一些更新用户的方法,无需远程进入他们的计算机并手动交换dll。想法包括欺骗ClickOnce认为当前版本是旧版本,以强制更新一台计算机。

这样做的原因是不会对其他用户造成影响,因为协调位置是一项艰巨的任务。

- 进度更新 -

尝试欺骗ClickOnce,我发现4个文件包含产品的版本号,3个cdf-ms文件和1个清单。如果版本号被更改,其中两个cdf-ms文件(都在应用程序的清单目录中)可能会破坏应用程序,这对我来说很有希望。

他们都有字符串“%publicKeyToken%”字符串,然后是版本号。字符串在两者中都相同,一个用“typewin32 %%%”完成,而另一个用“version%”。我想我正在走向死胡同,但它确实存在。

在“版本”之后更改版本号会出现以下错误:

Problem signature:
 Problem Event Name:    CLR20r3
 Problem Signature 01:  RecordConnect.exe
 Problem Signature 02:  1.0.0.0
 Problem Signature 03:  56caca4f
 Problem Signature 04:  mscorlib
 Problem Signature 05:  4.0.30319.34209
 Problem Signature 06:  534894cc
 Problem Signature 07:  7e6
 Problem Signature 08:  0
 Problem Signature 09:  System.ArgumentException
 OS Version:    6.1.7601.2.1.0.256.48
 Locale ID: 3081
 Additional Information 1:  0a9e
 Additional Information 2:  0a9e372d3b4ad19135b953a78882e789
 Additional Information 3:  0a9e
 Additional Information 4:  0a9e372d3b4ad19135b953a78882e789

在“typewin32”之后更改版本号会出现以下错误:

Following errors were detected during this operation.
    * [30/08/2016 12:20:29 PM] System.Runtime.InteropServices.COMException
        - The referenced assembly is not installed on your system. (Exception from HRESULT: 0x800736B3)
        - Source: mscorlib
        - Stack trace: 
            at System.Deployment.Internal.Isolation.IsolationInterop.CreateActContext(CreateActContextParameters& Params)
            at System.Deployment.Internal.Isolation.IsolationInterop.CreateActContext(IDefinitionAppId AppId)
            at System.ActivationContext.CreateFromName(ApplicationIdentity applicationIdentity)
            at System.ActivationContext.CreatePartialActivationContext(ApplicationIdentity identity)
            at System.Deployment.Application.ApplicationActivator.Activate(DefinitionAppId appId, AssemblyManifest appManifest, String activationParameter, Boolean useActivationParameter)
            at System.Deployment.Application.ApplicationActivator.ProcessOrFollowShortcut(String shortcutFile, String& errorPageUrl, TempFile& deployFile)
            at System.Deployment.Application.ApplicationActivator.PerformDeploymentActivation(Uri activationUri, Boolean isShortcut, String textualSubId, String deploymentProviderUrlFromExtension, BrowserSettings browserSettings, String& errorPageUrl)
            at System.Deployment.Application.ApplicationActivator.ActivateDeploymentWorker(Object state)

- 进度更新 -

找到了注册表。

HKEY_CLASSES_ROOT \ SOFTWARE \微软\ CURRENTVERSION \部署\ SideBySide \ 2.0

Inside是可以容纳版本号的所有地方。看起来大约有20个包含版本号的注册表项。大多数更改都是无害的,一个会破坏系统,一个实际上会触发更新提示。不幸的是,更新提示尚未实际更新。

- 进度更新 -

在注册表中再浏览一下,保存了一个.reg文件,让生活更轻松。 .reg更新了ComponentStore_RandomString值并触发了重新安装。不完全是所期望的,但它是一种东西。

2 个答案:

答案 0 :(得分:1)

我认为尝试欺骗ClickOnce的方法将是一个痛苦且容易出错的过程。对于我见过的大多数ClickOnce部署,我都倾向于这里所需的最低版本设置。您可以使用所需的最低版本(在Visual Studio中,转到project properties > publish tab > Updates... button),以允许用户继续运行旧版本的应用程序,即使您已推出较新版本。在您的情况下,将最低要求版本设置为适用于大多数人的当前版本似乎非常理想,然后为每个人推出补丁。您遇到此问题的客户可以使用最新版本来解决问题,但没有其他人被迫更新,因为他们是最低要求的版本。他们可以随时更新,知道它不会真正为他们改变任何东西。

以下是使用所需最低版本的一些文档,因此您可以查看它是否适合您,请参阅需要更新部分:https://msdn.microsoft.com/en-us/library/s22azw1e.aspx。很抱歉,如果这个答案不是超级特定的,那么有很多设置可以影响这一点,例如你是否只在线,当应用程序检查更新时等等。

答案 1 :(得分:0)

改变一个值以使ClickOnce认为程序​​属于早期版本的初始计划是愚蠢的,我建议不要尝试这样做。 ClickOnce是一个非常令人困惑的系统。但是,我发现了一种触发相同版本软件更新的方法。

在注册表中,如果您遵循以下路径

HKEY_CLASSES_ROOT\Software\Microsoft\CurrentVersion\Deployment\SideBySide\2.0\PackageMetadata

我找到了两个长名字的键,看起来像十六进制值。在这些键中,还有3个键具有与我的应用程序相对应的名称,reco..tion。两个包含类似的扩展名,包含" 0002.0001",但最后一个只包含一个长字符串(公钥标记)后面跟着另一个,当重新安装或完全不同的版本时,它不会改变软件已安装。这是初始帖子中提到的文件夹,如果它被更改,则会破坏应用程序。删除后,我的软件会将其视为版本更改(因为包含该信息的元数据已被删除),并使用最新版本重新安装所有内容。

我真的希望这有助于我的职位,但鉴于我在互联网上发现的大量信息,我怀疑很多人都在尝试做这个愚蠢的任务。