我在功能区上有一个按钮,用于检查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
会返回{{ 1}}。
我该如何解决这个问题?
答案 0 :(得分:1)
我相信答案可以在这篇MSDN帖子中找到:VSTO, ClickOnce and auto update
摘录:
这是真的:VSTO应用程序是ClickOnce应用程序
这不是真的:VSTO应用程序支持ClickOnce API 为什么:虽然VSTO应用程序是ClickOnce应用程序,但它们需要扩展ClickOnce基础实现的功能。此要求的一个产品是,并非ClickOnce(对于Windows窗体)中的所有内容都适用于VSTO。其中一个特定领域是Runtime API。
这是真的:API的某些部分可以正常运行 为什么:因为VSTO Runtime使用ClickOnce的核心部分,所以某些部分实际上会起作用。不知道的是这条线的确切位置。我发现一般经验法则是非常松散的:任何不改变应用程序状态的东西(任何为你提供信息"信息")都可能有效。这就是我的博客文章描述如何使用API来检查"对于更新,但使用VSTOInstaller exe来执行更新的实际操作。
这不是真的:您可以使用API下载更新 为什么:这可以追溯到ClickOnce / VSTO的差异。如果您将ClickOnce想象为这种通用技术,您可以将VSTO视为其特定实现。在大多数情况下(特别是Winforms应用程序),通用技术可以完成所需的一切。但是对于VSTO,我们需要扩展技术,使其能够完成以前从未做过的事情(特别是在办公室注册自定义并保持一些数据需要设置入口点等等)。因此,通用技术不能提供我们所需的所有功能。在此特定情况下,更新会更改应用程序的状态,以便我们必须更改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();
它不完全是生产就绪的代码,但你明白了。