C# 单击一次应用程序如何确定其应用程序标识?

C# 单击一次应用程序如何确定其应用程序标识?,c#,clickonce,C#,Clickonce,我有一个click once应用程序,它经过正确的签名、正确的配置,并且安装本身没有任何问题 它设置为脱机运行,但从特定URL安装,如果我下载并运行setup.exe,它将安装更新 所以,它基本上都在工作。。。除非我无法打印出版本号,或从代码中触发更新。如果我尝试,我会得到一个可怕的结果:“应用程序标识未设置。” 2017-01-10 13:43:14.8367 ERROR System.Deployment.Application.InvalidDeploymentException: App

我有一个click once应用程序,它经过正确的签名、正确的配置,并且安装本身没有任何问题

它设置为脱机运行,但从特定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-one;但是从“开始”菜单执行相同的应用程序将正确地将
IsNetworkDeployed
返回为true

然而,我还不能确定技术上的区别是什么,或者为什么一个人正确地检测到了安装,而另一个人却没有。(或者说,为什么这个特定的应用程序不能从“开始”菜单工作,而其他没有明显区别的应用程序却可以)

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

  • 应用程序的工作目录
  • 直接或通过shell启动application.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

…以某种方式启动应用程序的“单击一次感知”实例。但是怎么做呢?

我仍然很乐意接受这样一个答案,解释启动应用程序的勇气实际上是如何用一个身份设置应用程序上下文的,但现在,对于以后发现这个问题的其他人,我最好尝试一下:

  • 点击安装url或使用“开始”菜单上包含url的
    .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。不能将命令行参数传递给它

例如

(如果要查找URL,请搜索应用程序的
appref ms
文件的开始菜单;URL包含在其中)

…可执行文件如何使用标识启动

不知道;但这似乎是所有人都能理解的:

(tldr;magic。可能与如何使用ApplicationContext api调用CreateProcess以生成应用程序有关,该api结合了DFsvc.exe.DFshim.dll和DFdll.dll)

(其余信息摘自Ian Picknel的这篇旧博文:)

完成部署清单后 存储在Internet临时文件文件夹中,然后使用Internet Explorer 尝试确定它应该如何使用(假定)来处理文件 和实际应用程序扩展。它检查用户特定的文件 在HKCU\Software\Classes中键入,如果找不到 .应用程序子项,检查计算机特定的文件类型 香港文化中心。这意味着它建立了.application扩展 表示一个Application.Manifest文件。然后它使用这些信息来 检查用户特定的HKCU\Software\Classes\Application.Manifest和 用于建立CLSID的特定于计算机的HKCR\Application.Manifest密钥 处理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:\WINDOWS\system32\DFshim.dll

这就是事情开始变得有点复杂的地方。我刚才说 没有“魔法”在幕后发生。好吧,虽然那是 对于检索部署清单的过程,为true cer
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);