我有一次点击一次的应用程序,该应用程序已正确签名,配置正确,并且可以毫无问题地自行安装。
它设置为脱机运行,但是从特定URL安装,如果我下载并运行setup.exe,它会安装更新。
所以,它基本上都在工作......除了我不能打印版本号,或从代码中触发更新。如果我尝试,我会感到害怕:“未设置应用程序标识。”
2017-01-10 13:43:14.8367 ERROR System.Deployment.Application.InvalidDeploymentException: Application identity is not set.
at System.Deployment.Application.ApplicationDeployment.get_CurrentDeployment()
at LibDataAgent.Internal.Services.UpdateService.Deployment() System.Deployment.Application.InvalidDeploymentException: Application identity is not set.
at System.Deployment.Application.ApplicationDeployment.get_CurrentDeployment()
at LibDataAgent.Internal.Services.UpdateService.Deployment()
我没有在调试模式下运行,也没有使用调试版本。
所以这是我的实际问题:
System.Deployment.Application
中的click-once代码在运行时如何确定应用程序标识是什么?
所以,围绕这个还有很多其他问题,但请不要将其作为副本关闭,据我所知,它不是一个。
以下是我不想要答案的事项清单:
ApplicationDeployment
检查更新。非常简单,完全点击一次应用程序做什么,在运行时让它确定应用程序标识。
帮助!
我(迄今为止没有结果)尝试解决这个问题已经产生了这些注释:
我确定这与应用程序的启动方式有关,因为从命令行执行应用程序从未使用过click-once;但是从开始菜单执行相同的应用程序将正确返回IsNetworkDeployed
为真。
但是,我无法确定技术差异是什么,或者为什么人们正确检测到安装,而不是。 (或者实际上,为什么这个特定的应用程序在开始菜单中不起作用,当其他没有明显差异的情况时)。
我尝试的事情没有任何区别包括:
进入开始菜单的'MyApplication.appref-ms'有一些神奇之处; appref-ms只是安装路径的URL:
http://s3-ap-southeast-1.amazonaws.com/blahblah/Dev/MyApplication.application#MyApplication.application, Culture=neutral, PublicKeyToken=fdasdfsafads, processorArchitecture=x86
... 以某种方式启动应用程序的“click once once”实例。但是如何?
答案 0 :(得分:7)
我仍然乐意接受一个解释,解释启动应用程序的内容实际上如何使用身份设置应用程序上下文,但是现在,这是我最好的准备工作。对于后来发现此问题的其他人:
通过点击安装网址或使用包含网址的开始菜单上的.appref-ms
文件启动ClickOnce应用程序。
为下载的文件调用application/x-ms-application
MIME类型处理程序,启动“ClickOnce”'应用程序的实例。
在运行时,ApplicationContext.Identity
用于确定ClickOnce详细信息,并设置CurrentDeployment
对象。
据有关人员所知,直接启动ClickOnce应用程序的部署可执行文件(在C:\ Users \ Administrator \ AppData \ Local \ Apps \ 2.0 \ b107ee1 ...或任何安装文件夹中)将始终将IsNetworkDeployed
作为false返回,并且无法自行更新。
实际上,这意味着:
您正在寻找安装文件夹和.exe的路径?不要打扰。即使你知道它在哪里,当你运行它时也不会有正确的ApplicationContext
。
产生新的' ClickOnce'应用程序的实例在其安装URL上启动Internet Explorer。您无法将命令行参数传递给它。
例如
var url = "http://s3-ap-southeast-1.amazonaws.com/blahblah/Dev/MyApplication.application#MyApplication.application, Culture=neutral, PublicKeyToken=fdasdfsafads, processorArchitecture=x86";
var psi = new ProcessStartInfo
{
FileName = @"iexplore",
Arguments = $"\"{url}\"",
};
Process.Start(psi);
(如果你想找到这个URL,可以通过应用程序的appref-ms
文件的开始菜单进行搜索;其中包含url)
...以及如何使用身份启动可执行文件?
不知道;但这是任何人似乎都有理解它:
(tldr; magic。可能与如何调用CreateProcess以使用ApplicationContext api生成应用程序,在某些DFsvc.exe.DFshim.dll和DFdll.dll的组合中)
(其余信息来自Ian Picknel撰写的这篇旧博文:http://ianpicknell.blogspot.com.au/2010/03/launching-clickonce-application.html)
部署清单一直存在 然后存储在Internet临时文件文件夹,Internet Explorer中 尝试建立它应该如何处理文件(假设 和实际)。应用程序扩展。它检查用户特定的文件 HKCU \ Software \ Classes的类型,如果找不到 .application子键,检查机器特定的文件类型 HKCR。通过这意味着它建立了.application扩展 表示Application.Manifest文件。然后它使用此信息 检查用户特定的HKCU \ Software \ Classes \ Application.Manifest和 机器特定的HKCR \ Application.Manifest键用于建立CLSID 一个库处理Application.Manifest文件并产生 结果{98af66e4-aa41-4226-b80f-0b1a8f34eeb4}。最后,它查找了 这个CLSID在用户特定的 HKCU \ Software \ Classes \ CLSID {98af66e4-aa41-4226-b80f-0b1a8f34eeb4}和 机器特定的HKCR \ CLSID {98af66e4-aa41-4226-b80f-0b1a8f34eeb4} 建立.application文件的路径由。处理 C:\窗口\ system32 \ DFshim.dll
。这是事情开始变得有点复杂的地方。我刚才说过 没有魔法'幕后发生的事情。嗯,虽然那是 对于最常检索部署清单的过程是true 实际发起的过程当然不是这样 一旦检索到部署清单,就会单击ClickOnce应用程序 并且已经识别出处理程序DFshim.dll。
DFshim.dll在注册表中描述为' Manifest mime处理程序' 虽然它的文件属性将其描述为'应用程序 部署支持库'。它实现了Internet Explorer MIME 处理程序COM接口。它是一个用Microsoft编写的本机32位DLL Visual C ++ 2005,当安装到C:\ Windows \ system32时 已安装.NET Framework 2.0。
DFshim.dll具有对DFdll.dll的硬编码引用,它位于此处 通过检查的值 HKLM \ SOFTWARE \ Microsoft.NETFramework \ InstallRoot(通常 C:\ Windows \ Microsoft.NET \ Framework)和下面的键 HKLM \ SOFTWARE \ Microsoft.NETFramework \ Policy \ AppPatch(通常 v2.0.50727,即使安装了更高版本的Framework,也是如此。 DFdll.dll也是用Microsoft Visual C ++编写的本机32位DLL 2005。
DFdll.dll使用DFsvc.exe公开的COM服务,也是 位于.NET Framework文件夹中。 DFsvc.exe是标准的.NET MSIL组装。 DFsvc包含一个Main方法(在 System.Deployment.Application命名空间)简单地调用 内部System.Deployment.Application.DFServiceEntryPoint.Initialize System.Deployment.dll中的方法。 Initialize方法注册 System.Deployment.Application.DeploymentServiceCom与COM通过 System.Runtime.InteropServices.RegistrationServices(即它执行 使用CLSID相当于COM中的CoRegisterClassObject {33246f92-d56f-4e34-837a-9a49bfc91df3}。这是它的手段 DFdll.dll提供服务。
公开的COM服务 System.Deployment.Application.DeploymentServiceCom委托了 其大多数方法都在其他非ComVisible类中 System.Deployment.Application命名空间。例如,公众 ActivateDeployment方法在新的上调用ActivateDeployment System.Deployment.Application.ApplicationActivator实例, public CheckForDeploymentUpdate方法调用CheckForDeploymentUpdate 在System.Deployment.Application.SubscriptionStore等上。
很明显,绝大部分工作围绕着实际 ClickOnce应用程序的安装和启动由 System.Deployment命名空间中的类,托管在其中 DFsvc.exe。 DFshim.dll和DFdll.dll似乎主要负责 用于在基于COM的Internet Explorer世界之间进行仲裁 基于.NET的ClickOnce世界。