从 Office 本身更新 ClickOnce VSTO AddIn 不会更新 AddIn

问题描述 投票:0回答:1

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

这是代码

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

我该如何解决这个问题?

c# .net ms-office vsto add-in
1个回答
3
投票

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

摘录:

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

这不是真的:VSTO 应用程序支持 ClickOnce API
原因:虽然 VSTO 应用程序是 ClickOnce 应用程序,但它们需要扩展 ClickOnce 基本实现的功能。此要求的一个结果是,并非 ClickOnce(对于 Windows 窗体)中的所有内容都适用于 VSTO。这些特定领域之一是运行时 API。

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

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

他提到了一篇博文,我相信就是这个:VSTO 中的 Click-Once 强制更新:我们不建议使用的某些内容,您无论如何都可以考虑。

摘录:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.