语境:
我正在使用 C# 和 Visual Studio 2015 来开发和部署带有 ClickOnce 的应用程序,并且我正在尝试缩小 ClickOnce 更新下载的大小。 ClickOnce is capable of delta-only updates :

问题:
我已经验证在 MyApp 更新之间,大多数文件的哈希签名不会改变(在命令行上使用 shasum 或在实际 list 文件中)。但是 ClickOnce 仍然会在每次更新时下载每个文件。
例如, MyApp 取决于 Emgu.CV.dll ,而我刚刚从 Visual Studio 2015 中发布了 MyApp 1.0.9.4。这是来自位于发布输出位置 Emgu.CV.dll 的 list 文件中的 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>
这是与之前部署 MyApp_1_0_9_2\MyApp.exe.manifest 相同的 .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>
它们是相同的。值得注意的是, <hash><dsig:DigestValue> 内容与 相同,就像在 1.0.9.21.0.9.4 版本之间的各自标签中声明的所有其他约 150MB 的依赖项一样。
这两个 list 文件之间实际上只有几个哈希值发生了变化。例如,MyApp.exe 哈希从
JryzNpD+emqeruXW7X2unRm0i58w9z9ct++Jeog40FI=
tF/hs87T4n9sMgoUJUmk31zAUsi7MsWXhLdKGxlR+EM=
但是从 1.0.9.21.0.9.4 的 ClickOnce 更新下载了 MyApp.exeEmgu.CV.dll 以及所有其他文件,无论是否更改!
为什么 ClickOnce 下载哈希没有改变的文件?

迄今为止的研究:
This SO question 是相关的,但答案不适用,因为我没有重建冗余下载的程序集,它们只是被复制(从不变的哈希签名可以看出)。
This SO question 是相关的,但提问者只是误解了“如果较新则复制”的意思。
我读过 this troubleshooting MSDN page ,我的问题没有出现。

最佳答案

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

关于c# - 为什么 ClickOnce 下载未更改的文件?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32706182/

10-11 22:51
查看更多