我使用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
。以下是来自清单文件中的Emgu.CV.dll
引用。发布输出位置MyApp\Application Files\MyApp_1_0_9_4\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>
这是与之前部署相同的.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的依赖项一样。< / p>
这两个清单文件之间只有几个哈希值实际发生了变化。例如,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是相关的,但提问者只是误解了什么&#34;复制如果更新&#34;的意思。
我已阅读this troubleshooting MSDN page,我的问题不会出现。