我在功能区上有一个按钮,用于检查外接程序(本身)更新
这里的代码
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
。
我该怎么办?
1条答案
按热度按时间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.
摘录:
这并不是生产就绪的代码,但您可以理解。