更新ClickOnce在Office内部的VSTO插件不会更新该插件

本文关键字:插件 更新 VSTO ClickOnce Office 内部 | 更新日期: 2023-09-27 18:08:19

我在功能区上有一个按钮来检查插件(本身)更新

下面是代码

private void button1_Click(object sender, RibbonControlEventArgs e)
{
    UpdateCheckInfo info = null;
    if (ApplicationDeployment.IsNetworkDeployed)
    {
        ApplicationDeployment ad = ApplicationDeployment.CurrentDeployment;
        var appId = new ApplicationIdentity(ad.UpdatedApplicationFullName);
        var unrestrictedPerms = new PermissionSet(PermissionState.Unrestricted);
        var appTrust = new ApplicationTrust(appId)
        {
            DefaultGrantSet = new PolicyStatement(unrestrictedPerms),
            IsApplicationTrustedToRun = true,
            Persist = true
        };
        ApplicationSecurityManager.UserApplicationTrusts.Add(appTrust);
        info = ad.CheckForDetailedUpdate();
        if (info.UpdateAvailable)
        {
            ad.Update();
            MessageBox.Show("DONE");
        }
    }
}

发生的事情是我得到"完成"消息框,但重新启动Excel后,外接程序实际上没有更新我不能再次更新,因为下次我单击相同的按钮时,ApplicationDeployment.IsNetworkDeployed返回false

我该如何解决这个问题?

更新ClickOnce在Office内部的VSTO插件不会更新该插件

我相信答案可以在这个MSDN帖子中找到:VSTO, ClickOnce和自动更新

摘录:

This is True: VSTO应用程序是ClickOnce应用程序

这不是真的: ClickOnce API是由VSTO应用程序支持的为什么:虽然VSTO应用程序是ClickOnce应用程序,但它们需要扩展ClickOnce基本实现的功能。这种需求的产物是,并不是ClickOnce (Windows窗体)中的所有内容都适用于VSTO。其中一个特定的领域就是运行时API。

This is True: API的某些部分将正常工作为什么:因为VSTO运行时使用ClickOnce的核心部分,所以有些部分实际上会起作用。我们不知道的是这条线到底画在哪里。我发现了一个非常宽松的一般经验法则:任何不改变应用程序状态的东西(任何为您提供"信息"的东西)都可能工作。这就是为什么我的博文描述了如何使用API来"检查"的原因。,但使用VSTOInstaller exe来执行实际的更新操作。

这不是真的:你可以使用API来下载更新为什么:这回到ClickOnce/VSTO的差异。如果您将ClickOnce想象为这种通用技术,那么您可以将VSTO想象为它的特定实现。在大多数情况下(特别是Winforms应用程序),通用技术可以完成所需的一切。但对于VSTO,我们需要扩展技术,使其能够完成以前从未做过的事情(特别是在office中注册自定义并维护一些设置入口点所需的数据等)。因此,通用技术并不能提供我们需要的所有功能。在这种情况下,发生更新会改变应用程序的状态,因此我们必须更改Office的一些注册信息。ClickOnce"不知道"足以更新这些值,因此无法(在其当前状态下)执行"正确"操作。更新VSTO应用程序。执行这些步骤的是VSTO运行时。

他提到了一篇博客文章,我相信是这篇:点击一次在VSTO强制更新:有些东西我们不建议使用,你可能会考虑。

摘录:

//Call VSTOInstaller Explicitely in "Silent Mode"
string installerArgs = " /S /I ''''GenericServer''WordDocument2.vsto";
string installerPath = "C:''Program Files''Common Files''microsoft 
shared''VSTO''9.0''VSTOINSTALLER.exe";
System.Diagnostics.Process VstoInstallerProc = new System.Diagnostics.Process();
VstoInstallerProc.StartInfo.Arguments = installerArgs;
VstoInstallerProc.StartInfo.FileName = installerPath;
VstoInstallerProc.Start();
VstoInstallerProc.WaitForExit();

这不是完全可以用于生产的代码,但是您可以理解。