根据 ClickOnce.vsto 哈希更改更新 Outlook 插件

Update Outlook addin based on ClickOnce .vsto hash change

我设置了一个 ClickOnce 服务器来托管 Outlook 插件。它会自动为客户端机器提供当前版本。

当插件版本发生变化时,完美更新。但是,如果版本中的配置文件之一发生更改,我会重新生成清单,但它不会更新,因为它看到 .vsto 指向相同的版本号。它忽略对数字签名 DigestValue:

的更改
<dependency>
    <dependentAssembly dependencyType="install" codebase="MyAddin.dll.manifest" size="12345">
    <assemblyIdentity name="MyAddin.dll" version="1.0.0.25" publicKeyToken="1234567890abcdef" language="neutral" processorArchitecture="msil" type="win32" />
        <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>********************************</dsig:DigestValue>
        </hash>
    <dependentAssembly>
</dependency>

示例中唯一发生变化的部分是 **********(显然还有底部的 .vsto 签名)。

如果我尝试更改任何其他值,它会抱怨 .vsto 定义与 .dll.manifest 定义不匹配,或者 .dll.manifest 定义与目标装配。我不想仅仅因为 .config 文件更改就需要一个新的构建。

我如何强制 Outlook 注意到清单更改以便它实际安装,而不是认为它完全一样没有任何更改?

我终于在 Whosebug 上找到了试图做同样事情的人的相关问题:

How to update just one DLL in a ClickOnce installation?

它所需要的只是更改版本号。但它必须在 3 个地方进行更改,否则会抱怨 not manifest versions not matching。此版本号不必与正在部署的任何 .dll 文件匹配(即使它显示在标签 "assemblyIdentity" 下,这令人困惑)。每次任何文件更改时都可以生成新版本以强制更新(自动增量、散列、时间戳、随机数,但是你喜欢)。

我之前无法让它工作,因为我只更新了 2 个参考,而不是全部 3 个。

第一次引用此版本号是在应用程序清单的顶部:

<asmv1:assemblyIdentity name="MyAddin.dll" version="w.x.y.z" publicKeyToken="1234567890abcdef" language="neutral" processorArchitecture="msil" type="win32" />

第二名在部署清单的顶部:

<asmv1:assemblyIdentity name="MyAddin.vsto" version="w.x.y.z" publicKeyToken="1234567890abcdef" language="neutral" processorArchitecture="msil" xmlns="urn:schemas-microsoft-com:asm.v1" />

第三个位置在部署清单中:

<dependentAssembly dependencyType="install" codebase="MyAddin.dll.manifest" size="12345">
    <assemblyIdentity name="MyAddin.dll" version="w.x.y.z" publicKeyToken="1234567890abcdef" language="neutral" processorArchitecture="msil" type="win32" />