Click-once应用程序如何确定其应用程序标识?

时间:2017-01-10 06:11:40

标签: c# clickonce

我有一次点击一次的应用程序,该应用程序已正确签名,配置正确,并且可以毫无问题地自行安装。

它设置为脱机运行,但是从特定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代码在运行时如何确定应用程序标识是什么?

所以,围绕这个还有很多其他问题,但请不要将其作为副本关闭,据我所知,它不是一个。

以下是我想要答案的事项清单:

  • 如何签署点击一个应用程序。
  • 如何在构建时设置应用程序标识。
  • 如何找到其中安装了click-once应用程序。
  • 如何在调试时使点击一次应用程序正常工作。
  • 如何使用ApplicationDeployment检查更新。

非常简单,完全点击一次应用程序做什么,在运行时让它确定应用程序标识。

帮助!

注释

我(迄今为止没有结果)尝试解决这个问题已经产生了这些注释:

我确定这与应用程序的启动方式有关,因为从命令行执行应用程序从未使用过click-once;但是从开始菜单执行相同的应用程序将正确返回IsNetworkDeployed为真。

但是,我无法确定技术差异是什么,或者为什么人们正确检测到安装,而不是。 (或者实际上,为什么这个特定的应用程序在开始菜单中不起作用,当其他没有明显差异的情况时)。

我尝试的事情没有任何区别包括:

  • 应用程序的工作目录。
  • 直接或通过shell启动应用程序.exe
  • 从新的快捷方式启动应用程序

进入开始菜单的'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”实例。但是如何?

1 个答案:

答案 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世界。