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

Mik*_*ike 8 .net c# vsto add-in ms-office

我在功能区上有一个按钮来检查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");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

发生的事情是我收到"完成"消息框但重新启动Excel后,插件实际上没有更新,我无法再次更新它,因为下次我点击相同的按钮时,ApplicationDeployment.IsNetworkDeployed返回false.

我怎样才能解决这个问题?

Chr*_*ris 3

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

\n

摘录:

\n
\n

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

\n

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

\n

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

\n

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

\n
\n

他提到了一篇博客文章,我相信就是这个:VSTO 中的 Click-Onceforced update: Some things we don\xe2\x80\x99t suggest using,您无论如何都可以考虑。

\n

摘录:

\n
//Call VSTOInstaller Explicitely in "Silent Mode"\nstring installerArgs = " /S /I \\\\\\\\GenericServer\\\\WordDocument2.vsto";\nstring installerPath = "C:\\\\Program Files\\\\Common Files\\\\microsoft \nshared\\\\VSTO\\\\9.0\\\\VSTOINSTALLER.exe";\n\nSystem.Diagnostics.Process VstoInstallerProc = new System.Diagnostics.Process();\nVstoInstallerProc.StartInfo.Arguments = installerArgs;\nVstoInstallerProc.StartInfo.FileName = installerPath;\nVstoInstallerProc.Start();\nVstoInstallerProc.WaitForExit();\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n