语境:
我正在使用 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.2
和 1.0.9.4
版本之间的各自标签中声明的所有其他约 150MB 的依赖项一样。这两个 list 文件之间实际上只有几个哈希值发生了变化。例如,
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 ,我的问题没有出现。
最佳答案
问题是 ClickOnce 进度对话框。它始终显示您的应用程序的整个大小,即使它只下载了一个文件。确保运行像 Fiddler 这样的监控工具来查看实际传输的内容。
关于c# - 为什么 ClickOnce 下载未更改的文件?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32706182/