我的功能区上有一个按钮可以检查插件(本身)更新
这是代码
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
。
我该如何解决这个问题?
我相信可以在这篇 MSDN 帖子中找到答案:VSTO、ClickOnce 和自动更新
摘录:
这是真的:VSTO 应用程序是 ClickOnce 应用程序
这不是真的:VSTO 应用程序支持 ClickOnce API
原因:虽然 VSTO 应用程序是 ClickOnce 应用程序,但它们需要扩展 ClickOnce 基本实现的功能。此要求的一个结果是,并非 ClickOnce(对于 Windows 窗体)中的所有内容都适用于 VSTO。这些特定领域之一是运行时 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();
这不完全是生产就绪的代码,但你明白了。