[英]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.