我有一个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值并触发了重新安装。不完全是所期望的,但它是一种东西。
答案 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",但最后一个只包含一个长字符串(公钥标记)后面跟着另一个,当重新安装或完全不同的版本时,它不会改变软件已安装。这是初始帖子中提到的文件夹,如果它被更改,则会破坏应用程序。删除后,我的软件会将其视为版本更改(因为包含该信息的元数据已被删除),并使用最新版本重新安装所有内容。
我真的希望这有助于我的职位,但鉴于我在互联网上发现的大量信息,我怀疑很多人都在尝试做这个愚蠢的任务。