【发布时间】:2015-09-21 23:41:00
【问题描述】:
上下文:
我正在使用 C# 和 Visual Studio 2015 使用 ClickOnce 开发和部署应用程序,并且我正在尝试缩小 ClickOnce 更新下载大小。 ClickOnce is capable of delta-only updates:
更新应用程序时,ClickOnce 会将当前应用程序的应用程序清单中指定的文件的哈希签名与新版本进行比较。 如果不同,ClickOnce 会下载新版本。如果签名匹配,ClickOnce 会复制现有文件并在新版本的应用程序中使用它。这种方法可以防止 ClickOnce 必须再次下载整个应用程序,即使只有一两个文件发生了更改。
问题:
我已经验证,在MyApp 的更新之间,大多数文件的哈希签名不会改变(在命令行上使用shasum 或在实际的清单文件中)。但是 ClickOnce 仍然会在每次更新时下载每个文件。
例如,MyApp 依赖于 Emgu.CV.dll,而我刚刚在 Visual Studio 2015 中发布了 MyApp 1.0.9.4。这是来自位于发布输出位置 MyApp\Application Files\MyApp_1_0_9_4\MyApp.exe.manifest 的清单文件中的 Emgu.CV.dll 引用:
<dependentAssembly dependencyType="install" allowDelayedBinding="true" codebase="Emgu.CV.dll" size="363520">
<assemblyIdentity name="Emgu.CV" version="3.0.0.2158" publicKeyToken="7281126722AB4438" language="neutral" processorArchitecture="msil" />
<hash>
<dsig:Transforms>
<dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity" />
</dsig:Transforms>
<dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha256" />
<dsig:DigestValue>lUb/oa0aQL6HWEhY8Juj6Mc1wChKo0owhJJ+sSfqZUs=</dsig:DigestValue>
</hash>
</dependentAssembly>
这里是之前部署中相同的 .dll 依赖标记,MyApp_1_0_9_2\MyApp.exe.manifest:
<dependentAssembly dependencyType="install" allowDelayedBinding="true" codebase="Emgu.CV.dll" size="363520">
<assemblyIdentity name="Emgu.CV" version="3.0.0.2158" publicKeyToken="7281126722AB4438" language="neutral" processorArchitecture="msil" />
<hash>
<dsig:Transforms>
<dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity" />
</dsig:Transforms>
<dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha256" />
<dsig:DigestValue>lUb/oa0aQL6HWEhY8Juj6Mc1wChKo0owhJJ+sSfqZUs=</dsig:DigestValue>
</hash>
</dependentAssembly>
它们是相同的。值得注意的是,<hash><dsig:DigestValue> 的内容是相同的,就像在版本 1.0.9.2 和 1.0.9.4 之间的各自标签中声明的所有其他价值约 150MB 的依赖项一样。
这两个清单文件之间实际上只有几个哈希值发生了变化。例如,MyApp.exe 哈希从
JryzNpD+emqeruXW7X2unRm0i58w9z9ct++Jeog40FI=
到
tF/hs87T4n9sMgoUJUmk31zAUsi7MsWXhLdKGxlR+EM=
但是从 1.0.9.2 到 1.0.9.4 的 ClickOnce 更新下载了 MyApp.exe 和 Emgu.CV.dll 所有其他文件,无论是否更改!
为什么 ClickOnce 会下载哈希未更改的文件?
研究至今:
This SO question 是相关的,但答案不适用,因为我没有重建冗余下载的程序集,它们只是被复制(从不变的哈希签名中可以看出)。
This SO question 是相关的,但提问者只是误解了“如果较新则复制”的含义。
我已经阅读this troubleshooting MSDN page,我的问题没有出现。
【问题讨论】:
-
您是否注意到“如果您使用 Visual Studio 编译您的应用程序,它会在您重建整个项目时为所有文件生成新的哈希签名。在这种情况下,所有程序集将被下载到客户端,尽管可能只有少数程序集发生了变化。” Link
-
是的,我做到了。请注意,哈希值完全相同。从原始目录到已编译的
\bin目录,再到已发布的.deploy文件,都是如此。 -
您如何知道文件正在重新下载?你怎么确认?你不能按照下载进度条所说的去做。即使它只下载一个,它也始终具有所有文件的完整大小。您是否使用 Fiddler 之类的工具来确认实际下载的内容?
-
@codeConcussion,已解决。把它以答案的形式写下来,它就是你的了。我确实是依赖下载进度条。我只是在“下载”过程中使用了网络监控工具,发现实际上下载的内容很少。进度条还必须显示从旧 clickonce 目录到新目录的复制进度。
标签: c# visual-studio hash clickonce auto-update