Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 更新代码签名证书后,ClickOnce升级期间用户设置丢失_.net_Clickonce_Code Signing - Fatal编程技术网

.net 更新代码签名证书后,ClickOnce升级期间用户设置丢失

.net 更新代码签名证书后,ClickOnce升级期间用户设置丢失,.net,clickonce,code-signing,.net,Clickonce,Code Signing,我们的代码签名证书最近过期了,所以我更新了它,并发布了使用新证书的第一个版本。不幸的是,安装升级的任何客户都会丢失用户范围的应用程序设置,并将其重置为默认值。我很确定其他升级总是从以前的版本复制用户设置,所以我猜新证书有一些问题。我们使用的是购买的证书,不是测试证书。我们的应用程序是一个针对.NET3.5的WinForms应用程序。自我们购买第一个证书以来的三年中,证书颁发机构似乎已经易手,因此颁发者字段是不同的 有什么方法可以避免在续订代码签名证书时丢失用户设置?多亏了来自的一些提示,这是一个

我们的代码签名证书最近过期了,所以我更新了它,并发布了使用新证书的第一个版本。不幸的是,安装升级的任何客户都会丢失用户范围的应用程序设置,并将其重置为默认值。我很确定其他升级总是从以前的版本复制用户设置,所以我猜新证书有一些问题。我们使用的是购买的证书,不是测试证书。我们的应用程序是一个针对.NET3.5的WinForms应用程序。自我们购买第一个证书以来的三年中,证书颁发机构似乎已经易手,因此颁发者字段是不同的

有什么方法可以避免在续订代码签名证书时丢失用户设置?

多亏了来自的一些提示,这是一个非常简单的修复方法。看起来用户设置框架可以看到以前的版本,但由于某种原因,它们没有升级。我习惯于在第一次运行新版本时手动调用。多次测试此升级过程的一个有用技巧是在当前版本上复制应用程序清单的旧版本

看起来我相当幸运。在某些情况下,每当您续订证书时,客户必须完全卸载并重新安装

写了一封信。我发现有,但听起来不太可能修复。听起来,以.NET4.0为目标可能会解决这个问题,但从3.5到4.0的过渡可能是可行的

有一件事可以使到期过程更加顺利,那就是给签名加上时间戳。这样,您就不必在旧证书过期之前续订证书并发布新版本。我看到的唯一提到的时间戳服务器URL是:


让我们先看看与应用程序设置升级相关的一些问题,然后再看看用户设置细节

您链接到的文章说,只要您不是VSTO 2010应用程序,您就可以(wrt bare upgradability)。如果你是这样的话,重新定位到.NET 4.0仍然是一个非常简单的练习,前提是:你需要在客户的系统上提供.NET 4.0。如果不是这样的话,那就把你在介绍你的应用程序那天发给他们的电子邮件挖出来(带有要安装的URL),然后再传阅一遍。此方法将为他们配备.NET4(但不能像往常一样简单地启动应用程序)

ClickOnce还要求您的身份(Subject-CN部分)在新旧证书上保持一致,以确认它仍然是同一个应用程序。是这样吗?仔细研究主题细节

如果一切都失败了,那么关于应用程序设置的最后一次机会就是操纵
app.exe.config
,它通过应用程序以编程方式存储应用程序的设置。如果您拥有在客户系统上执行此操作的访问权限,也就是说


原因是ClickOnce正在尝试将新版本的默认设置与旧版本下的特定用户设置合并。但是,可以通过覆盖应用程序设置库来自定义此逻辑。升级

谢谢您的建议。我说的是用户范围的应用程序设置,所以我在问题中澄清了这一点。我检查了新旧证书中的主题字段,没有任何更改。但是,主题密钥标识符字段不匹配。这两个证书来自不同的机构,因此可能它们生成的标识符不同。更改的主题密钥ID不是问题。这一点预计会改变。您确实可以控制用户设置升级。创建一个应用程序设置类,覆盖
ApplicationSettingsBase.Upgrade
并从中调用
ApplicationSettingsBase.GetPreviousVersion
。您是否以这种方式查看旧用户设置?如果是这样的话,你就不会被你目前担心的任何错误所影响(.NET认为这是同一个应用程序,对你来说是幸运的)。对我来说确实是幸运的。正如您所建议的,当我调用
GetPreviousVersion()
时,可以看到上一版本的设置。我甚至不必重写
Upgrade()
,如果我显式调用它,它就可以工作。我想知道为什么ClickOnce部署没有正确地调用
Upgrade()
@DonKirkby-我很高兴它起到了作用。我更新了答案以更好地匹配更新后的问题。另请参见我添加的链接。我还纠正了自己的证书匹配问题,或者至少我希望我这样做了。