ClickOnce部署异常:部分用户点击启动链接报错直接运行EXE正常
根因定位
从报错栈可以直接定位核心问题:ClickOnce启动流程与直接双击EXE的配置文件加载逻辑存在差异,具体差异如下:
- 直接运行Apps\2.0下的EXE时,.NET运行时仅会加载EXE同目录下的
MyApplication.exe.config应用级配置文件,该文件是部署时打包的固定文件,不存在损坏问题 - 通过ClickOnce启动链接打开应用时,.NET运行时会额外加载用户级配置文件
user.config,该文件存储在%localappdata%\Selerant\下对应带随机哈希的应用目录中,仅在当前用户本地生成、读写。报错栈中的System.Xml.XmlException就是解析该文件时遇到了非法字符、文件不完整等损坏问题,后续触发了配置加载失败、Locale类静态初始化失败的连锁异常。
只有部分用户报错的原因也很明确:只有这部分用户的本地user.config因为异常场景(程序崩溃时刚好在写配置、系统断电、磁盘写入错误等)出现了损坏,其余用户的本地配置文件正常,因此不会触发报错。
终端用户临时修复方案
遇到报错的用户可通过以下步骤快速恢复:
- 关闭所有MyApplication相关进程
- 打开资源管理器,在地址栏输入
%localappdata%\Selerant回车进入目录 - 删除所有名称前缀包含
MyApplication、带随机哈希字符串的子文件夹 - 重新点击ClickOnce启动链接,程序会自动生成全新的合法user.config,即可正常启动
开发/部署侧永久修复方案
要从根源避免该问题复发,可做以下优化:
- 在程序入口逻辑的最前端(早于任何
ConfigurationManager调用、Locale类初始化)增加user.config合法性校验逻辑:如果检测到配置文件解析失败,自动将损坏的配置文件备份后删除,程序启动时会自动重建默认配置 - 排查现有代码中用户配置写入逻辑,避免多线程同时写配置、异常中断写入的场景,写入配置时建议先写临时文件再替换原文件,避免写入中断导致原文件损坏
- 可在app.config中添加以下配置,优化配置加载容错性:
<configuration> <runtime> <!-- 禁用不必要的发布者证据生成,加快ClickOnce启动速度,减少异常概率 --> <generatePublisherEvidence enabled="false"/> </runtime> </configuration>
内容的提问来源于stack exchange,提问作者Andrea
相关产品推荐
相关产品推荐

