.net 从Office内部更新ClickOnce VSTO外接程序本身不会更新外接程序

qni6mghb  于 2023-10-21  发布在  .NET
关注(0)|答案(1)|浏览(86)

我在功能区上有一个按钮,用于检查外接程序(本身)更新
这里的代码

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
我该怎么办?

ebdffaop

ebdffaop1#

我相信答案可以在这篇MSDN文章中找到:VSTO, ClickOnce and auto update
摘录:

这是真的:VSTO应用程序是ClickOnce应用程序
这不是真的:VSTO应用程序支持ClickOnce API
为什么:虽然VSTO应用程序是ClickOnce应用程序,但它们需要扩展ClickOnce基本实现的功能。这种要求的一个结果是,ClickOnce(用于Windows窗体)中的所有内容并不都适用于VSTO。其中一个特定的领域是API API。
这是真的:API的某些部分将工作
为什么:因为VSTO插件使用了ClickOnce的核心部分,所以有些部分实际上是可以工作的。我们不知道的是,这条线究竟划在哪里。我发现了一个非常松散的一般经验法则:任何不改变应用程序状态的东西(任何为您提供“信息”的东西)都可能工作。这就是为什么我的博客文章描述了如何使用API来“检查”更新,但使用VSTODB.exe来执行实际的更新操作。
这不是真的:您可以使用API下载更新
为什么:这又回到了ClickOnce/VSTO的区别。如果您将ClickOnce想象成这种通用技术,那么您可以将VSTO想象成它的一种特定实现。在大多数情况下(特别是Winforms应用程序),通用技术可以完成所有需要的工作。对于VSTO,我们需要扩展这项技术,使其能够做以前从未做过的事情(特别是在Office中注册自定义,并维护一些设置入口点所需的数据)。因此,通用技术并不能提供我们需要的所有功能。在这种特定情况下,更新会更改应用程序的状态,因此我们必须更改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();

这并不是生产就绪的代码,但您可以理解。

相关问题