为什么ClickOnce正在下载未更改的文件

本文关键字:文件 下载 ClickOnce 为什么 | 更新日期: 2023-09-27 18:13:47

上下文:

我正在使用C#和Visual Studio 2015开发和部署带有ClickOnce的应用程序,并试图缩小ClickOnce更新下载大小。ClickOnce能够进行仅增量更新:

更新应用程序时,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.21.0.9.4之间的相应标签中声明的所有其他约150MB的依赖项一样。

在这两个清单文件之间,实际上只有几个散列值发生了变化。例如,MyApp.exe散列从更改

JryzNpD+emqeruXW7X2unRm0i58w9z9ct++Jeog40FI=

tF/hs87T4n9sMgoUJUmk31zAUsi7MsWXhLdKGxlR+EM=

但是从1.0.9.21.0.9.4的ClickOnce更新下载了MyApp.exeEmgu.CV.dll以及所有其他文件,无论是否更改

为什么ClickOnce正在下载哈希值没有更改的文件


迄今为止的研究:

这个SO问题是相关的,但答案不适用,因为我不是在重建正在冗余下载的程序集,它们只是在复制(从不变的哈希签名中可以明显看出(。

这个SO问题是相关的,但提问者只是误解了什么";如果更新则复制";意思是。

我已经阅读了这个MSDN疑难解答页面,我的问题没有出现。

为什么ClickOnce正在下载未更改的文件

问题在于ClickOnce进度对话框。它总是显示应用程序的整个大小,即使只有一个文件被下载。确保运行像Fiddler这样的监控工具来查看实际传输的内容。