从Office内部更新ClickOnce VSTO AddIn不会更新AddIn

时间:2016-09-21 14:11:27

标签: c# .net ms-office vsto add-in

我在功能区上有一个按钮,用于检查AddIn(本身)更新

这是代码

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");
        }
    }
}

我得到的是" DONE"消息框但重新启动Excel后,插件实际上未更新我无法再次更新它,因为下次单击同一按钮时,ApplicationDeployment.IsNetworkDeployed会返回{{ 1}}。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

我相信答案可以在这篇MSDN帖子中找到:VSTO, ClickOnce and auto update

摘录:

  

这是真的:VSTO应用程序是ClickOnce应用程序

     

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

     

这是真的:API的某些部分可以正常运行   为什么:因为VSTO Runtime使用ClickOnce的核心部分,所以某些部分实际上会起作用。不知道的是这条线的确切位置。我发现一般经验法则是非常松散的:任何不改变应用程序状态的东西(任何为你提供信息"信息")都可能有效。这就是我的博客文章描述如何使用API​​来检查"对于更新,但使用VSTOInstaller exe来执行更新的实际操作。

     

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

他提到了一篇博文,我相信这是一篇:Click-Once forced updates in VSTO: Some things we don’t recommend using, that you might consider anyway.

摘录:

//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();

它不完全是生产就绪的代码,但你明白了。