【发布时间】:2020-12-08 23:41:17
【问题描述】:
我有一个使用 ClickOnce 部署的 WPF 应用程序。它有一个自定义文件关联集,如果打开该文件类型,它可以在应用程序中打开和打开。这一直很好,然后在更新期间突然用户开始收到“应用程序无法启动”错误。
查看错误详细信息,我可以看到:
ERROR DETAILS
Following errors were detected during this operation.
* [12/8/2020 3:34:54 PM] System.UnauthorizedAccessException
- Attempted to perform an unauthorized operation.
- Source: mscorlib
- Stack trace:
at Microsoft.Win32.RegistryKey.Win32Error(Int32 errorCode, String str)
at Microsoft.Win32.RegistryKey.SetValue(String name, Object value, RegistryValueKind valueKind)
at System.Deployment.Application.ShellExposure.AddFileAssociation(FileAssociation fileAssociation, DefinitionIdentity subId, Uri deploymentProviderUri)
at System.Deployment.Application.ShellExposure.AddShellExtensions(DefinitionIdentity subId, Uri deploymentProviderUri, AssemblyManifest appManifest)
at System.Deployment.Application.ShellExposure.UpdateShellExtensions(SubscriptionState subState, ShellExposureInformation& shellExposureInformation)
at System.Deployment.Application.ShellExposure.UpdateSubscriptionShellExposure(SubscriptionState subState)
at System.Deployment.Application.SubscriptionStore.CommitApplication(SubscriptionState& subState, CommitApplicationParams commitParams)
at System.Deployment.Application.ApplicationActivator.InstallApplication(SubscriptionState& subState, ActivationDescription actDesc)
at System.Deployment.Application.ApplicationActivator.PerformDeploymentActivation(Uri activationUri, Boolean isShortcut, String textualSubId, String deploymentProviderUrlFromExtension, BrowserSettings browserSettings, String& errorPageUrl, Uri& deploymentUri)
at System.Deployment.Application.ApplicationActivator.PerformDeploymentActivationWithRetry(Uri activationUri, Boolean isShortcut, String textualSubId, String deploymentProviderUrlFromExtension, BrowserSettings browserSettings, String& errorPageUrl)
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Deployment.Application.ApplicationActivator.PerformDeploymentActivationWithRetry(Uri activationUri, Boolean isShortcut, String textualSubId, String deploymentProviderUrlFromExtension, BrowserSettings browserSettings, String& errorPageUrl)
at System.Deployment.Application.ApplicationActivator.ActivateDeploymentWorker(Object state)
我确定这是文件关联,因为这是 ClickOnce AFIK 唯一触及注册表的内容。删除它后,问题就消失了,但现在该程序没有文件扩展名。我尝试使用提升的权限进行安装,但这也没有解决问题。重新添加扩展会导致问题再次出现。在此更新中,我们没有触及任何底层文件关联或启动逻辑,那么到底是什么导致了这个问题?
有没有人在使用 ClickOnce 和文件关联时遇到过这种情况?
编辑:使用 VS2017 的 Publish->Options 创建关联(将信息放入 .csproj 文件)。
<ItemGroup>
<FileAssociation Include=".simsp">
<Visible>False</Visible>
<Description>My Description</Description>
<Progid>MyProgram.Proposal</Progid>
<DefaultIcon>Proposal.ico</DefaultIcon>
</FileAssociation>
</ItemGroup>
此外,在卸载和删除与该应用程序相关的 AppData 文件后,该应用程序可以正常安装在一台机器上,但不能在同一用户帐户下安装另一台机器(我们使用文件同步来复制桌面)。这令人困惑,因为如果用户路径中的 AppData 文件存在问题,我不确定为什么在注册表项期间安装会失败。
编辑 3:问题似乎是随机发生的,但我们注意到它是在打开文件时发生的,导致 ClickOnce 应用程序打开并更新。到目前为止,对于使用文件同步、具有多个工作站的复制桌面的用户来说,该问题似乎是孤立的。
解决此问题的最佳做法?这可能只是 ClickOnce 的限制。
【问题讨论】:
-
您的 clickonce 清单是什么样的?你在用
fileAssociation吗? -
@PavelAnikhouski 我正在使用 VS2017 的内置发布设置进入 .csproj 文件。我假设它在发布时在清单中生成。我可以再次创建关联,看看今晚清单说了什么。
-
@PavelAnikhouski 我更新了问题。我猜该关联不会将自己添加到清单中,因为它不存在。这是在 .csproj 文件中生成的内容。想法?
标签: c# wpf deployment clickonce