簡體   English   中英

從Office本身更新ClickOnce VSTO加載項不會更新該加載項

[英]Updating ClickOnce VSTO AddIn from within the Office itself does not update the AddIn

我在功能區上有一個按鈕來檢查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返回false

我怎樣才能解決這個問題?

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

摘錄:

這是真的 :VSTO應用程序是ClickOnce應用程序

這不是正確的 :VSTO應用程序支持ClickOnce API。 原因 :VSTO應用程序是ClickOnce應用程序時,它們需要擴展ClickOnce基本實現的功能。 此要求的產物是,並非ClickOnce(適用於Windows窗體)中的所有內容都適用於VSTO。 這些特定領域之一是Runtime 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();

它不是完全可以用於生產的代碼,但是您可以理解。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM