单击一次应用程序如何确定其应用程序身份?

2024-01-30

我有一个单击一次的应用程序,它已正确签名、正确配置并自行安装,没有任何问题。

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

因此,围绕此还有很多其他问题,但请不要将其作为重复项关闭,据我所知,它不是一个。

这是我列出的东西do not想要以下问题的答案:

  • How to sign一键式应用程序。
  • How to set您构建时的应用程序标识。
  • 怎么找where单击一次的应用程序已安装。
  • 如何使单击一次的应用程序同时运行调试.
  • 如何使用检查更新ApplicationDeployment.

就很直白的说,exactly单击一次的应用程序有什么作用,在运行时让它确定应用程序身份。

Help!

Notes

我(迄今为止没有结果)尝试解决这个问题得到了这些笔记:

我确信这与应用程序的启动方式有关,因为从命令行执行应用程序从来没有使用过单击一次;但从开始菜单执行相同的应用程序将正确返回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

...哪个somehow启动应用程序的“单击一次感知”实例。但如何呢?


我仍然会很高兴地接受一个答案,它解释了启动应用程序的实质是如何使用身份设置应用程序上下文的,但现在这是我对以后发现这个问题的其他人所发生的事情的最佳尝试:

  • ClickOnce 应用程序通过点击安装 URL 或使用.appref-ms开始菜单上的文件,其中包含 url。

  • The application/x-ms-application为下载的文件调用 MIME 类型处理程序,该处理程序启动应用程序的“ClickOnce 感知”实例。

  • 在运行时,ApplicationContext.Identity用于确定 ClickOnce 详细信息,并设置CurrentDeployment object.

  • 据任何人所知,直接启动 ClickOnce 应用程序的已部署可执行文件(在 C:\Users\Administrator\AppData\Local\Apps\2.0\b107ee1... 或任何安装文件夹中)将always return IsNetworkDeployed为 false,并且将无法自我更新。

实际上,这意味着:

  • 您正在寻找 .exe 的安装文件夹和路径吗?别打扰。即使你知道它在哪里,它也不会有正确的ApplicationContext当你运行它时。

  • 要生成应用程序的新“ClickOnce 感知”实例,请在其安装 URL 处启动 Internet Explorer。您不能将命令行参数传递给它。

eg.

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;魔术。可能与如何调用 CreateProcess 以使用 ApplicationContext api 生成应用程序有关,以 DFsvc.exe、DFshim.dll 和 Dll.dll 的某种组合形式)

(此信息的其余部分取自 Ian Picknel 的这篇旧博客文章:http://ianpicknell.blogspot.com.au/2010/03/launching-clickonce-application.html http://ianpicknell.blogspot.com.au/2010/03/launching-clickonce-application.html)

部署清单完成后 存储在 Temporary Internet Files 文件夹中,然后 Internet Explorer 尝试建立它应该如何处理文件(假设 和实际).application 扩展名。它检查用户特定的文件 在 HKCU\Software\Classes 中键入,如果找不到 .application 子键,检查机器特定的文件类型 香港CR。通过这意味着它确定了 .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。

这就是事情开始变得有点复杂的地方。我之前说过 幕后并没有发生任何“魔法”。好吧,虽然那是 对于检索部署清单的过程来说,这是最正确的 实际启动的过程当然不是这样 检索部署清单后,ClickOnce 应用程序 并且处理程序 DFshim.dll 已被识别。

DFshim.dll 在注册表中被描述为“Manifest mime handler” 尽管其文件属性将其描述为“应用程序” 部署支持库'。它实现了 Internet Explorer MIME 处理程序 COM 接口。它是一个本机 32 位 DLL,用 Microsoft 编写 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,即使安装了更高版本的框架)。 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 中的方法。初始化方法注册 System.Deployment.Application.DeploymentServiceCom 与 COM 通过 System.Runtime.InteropServices.RegistrationServices(即它执行 相当于 COM 中的 CoRegisterClassObject)使用 CLSID {33246f92-d56f-4e34-837a-9a49bfc91df3}。这就是其所采用的手段 服务可供 DFdll.dll 使用。

暴露的COM服务 System.Deployment.Application.DeploymentServiceCom 委托 它的大部分方法都适用于其他非 ComVisible 类 System.Deployment.Application 命名空间。例如,公众 ActivateDeployment 方法在新的 System.Deployment.Application.ApplicationActivator实例, 公共 CheckForDeploymentUpdate 方法调用 CheckForDeploymentUpdate 在 System.Deployment.Application.SubscriptionStore 等上

很明显,绝大多数工作都是围绕实际情况展开的。 ClickOnce 应用程序的安装和启动由 System.Deployment 命名空间中的类,托管于 DFsvc.exe。 DFshim.dll 和 DFdll.dll 似乎是主要责任 用于在基于 COM 的 Internet Explorer 世界和 基于 .NET 的 ClickOnce 世界。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

单击一次应用程序如何确定其应用程序身份? 的相关文章

  • 如何将非静态类成员“std::bind”绑定到 Win32 回调函数“WNDPROC”?

    我正在尝试将非静态类成员绑定到标准WNDPROC http msdn microsoft com en us library ms633573 aspx功能 我知道我可以通过将类成员设为静态来简单地做到这一点 但是 作为一名 C 11 ST
  • 复制 std::function 的成本有多高?

    While std function是可移动的 但在某些情况下不可能或不方便 复制它会受到重大处罚吗 它是否可能取决于捕获变量的大小 如果它是使用 lambda 表达式创建的 它依赖于实现吗 std function通常被实现为值语义 小缓
  • 在 LINQ 中按 Id 连接多表和分组

    我想按categoryId显示列表产品的名称组 这是我的代码 我想要我的视图显示结果 Desktop PC HP Red PC Dell Yellow PC Asus Red SmartPhone Lumia 720 Blue 我的组模型
  • 如何创建包含 IPv4 地址的文本框? [复制]

    这个问题在这里已经有答案了 如何制作一个这样的文本框 我想所有的用户都见过这个并且知道它的功能 您可以使用带有 Mask 的 MaskedTestBox000 000 000 000 欲了解更多信息 请参阅文档 http msdn micr
  • 回发后刷新时提示确认表单重新提交。我做错了什么?

    我有一个以空白 默认状态启动的仪表板 我让用户能够将保存的状态加载到仪表板中 当他们单击 应用 按钮时 我运行以下代码 function CloseAndSave var radUpload find radUpload1ID var in
  • 具有交替类型的可变参数模板参数包

    我想知道是否可以使用参数包捕获交替参数模式 例如 template
  • 如何在 Xaml 文本中添加电子邮件链接?

    我在 Windows Phone 8 应用程序中有一些大文本 我希望其中有电子邮件链接 例如 mailto 功能 这是代码的一部分
  • 使用自定义堆的类似 malloc 的函数

    如果我希望使用自定义预分配堆构造类似 malloc 的功能 那么 C 中最好的方法是什么 我的具体问题是 我有一个可映射 类似内存 的设备 已将其放入我的地址空间中 但我需要获得一种更灵活的方式来使用该内存来存储将随着时间的推移分配和释放的
  • 外键与独立关系 - Entity Framework 5 有改进吗?

    我读过了several http www ladislavmrnka com 2011 05 foreign key vs independent associations in ef 4 文章和问题 https stackoverflow
  • 等待进程释放文件

    我如何等待文件空闲以便ss Save 可以用新的覆盖它吗 如果我紧密地运行两次 左右 我会得到一个generic GDI error
  • CMake 无法确定目标的链接器语言

    首先 我查看了this https stackoverflow com questions 11801186 cmake unable to determine linker language with c发帖并找不到解决我的问题的方法 我
  • “接口”类似于 boost::bind 的语义

    我希望能够将 Java 的接口语义与 C 结合起来 起初 我用过boost signal为给定事件回调显式注册的成员函数 这非常有效 但后来我发现一些函数回调池是相关的 因此将它们抽象出来并立即注册所有实例的相关回调是有意义的 但我了解到的
  • 使用管道时,如果子进程数量大于处理器数量,进程是否会被阻塞?

    当子进程数量很大时 我的程序停止运行 我不知道问题是什么 但我猜子进程在运行时以某种方式被阻止 下面是该程序的主要工作流程 void function int process num int i initial variables for
  • 如何设置 log4net 每天将我的文件记录到不同的文件夹中?

    我想将每天的所有日志保存在名为 YYYYMMdd 的文件夹中 log4net 应该根据系统日期时间处理创建新文件夹 我如何设置它 我想将一天中的所有日志保存到 n 个 1MB 的文件中 我不想重写旧文件 但想真正拥有一天中的所有日志 我该如
  • 动态添加 ASP.Net 控件

    我有一个存储过程 它根据数据库中存储的记录数返回多行 现在我想有一种方法来创建 div 带有包含该行值的控件的标记 如果从数据库返回 10 行 则 10 div 必须创建标签 我有下面的代码来从数据库中获取结果 但我不知道如何从这里继续 S
  • 将 MQTTNet 服务器与 MQTT.js 客户端结合使用

    我已经启动了一个 MQTT 服务器 就像this https github com chkr1011 MQTTnet tree master例子 该代码托管在 ASP Net Core 2 0 应用程序中 但我尝试过控制台应用程序 但没有成
  • 方法优化 - C#

    我开发了一种方法 允许我通过参数传入表 字符串 列数组 字符串 和值数组 对象 然后使用这些参数创建参数化查询 虽然它工作得很好 但代码的长度以及多个 for 循环散发出一种代码味道 特别是我觉得我用来在列和值之间插入逗号的方法可以用不同的
  • C++ 条件编译

    我有以下代码片段 ifdef DO LOG define log p record p else define log p endif void record char data 现在如果我打电话log hello world 在我的代码中
  • WebSocket安全连接自签名证书

    目标是一个与用户电脑上安装的 C 应用程序交换信息的 Web 应用程序 客户端应用程序是 websocket 服务器 浏览器是 websocket 客户端 最后 用户浏览器中的 websocket 客户端通过 Angular 持久创建 并且
  • 当从finally中抛出异常时,Catch块不会被评估

    出现这个问题的原因是之前在 NET 4 0 中运行的代码在 NET 4 5 中因未处理的异常而失败 部分原因是 try finallys 如果您想了解详细信息 请阅读更多内容微软连接 https connect microsoft com

随机推荐