打开文件关联以空白命令行启动ClickOnce应用程序

问题描述 投票:0回答:1

我正在开发一个VB.NET Windows Forms应用程序来编辑扩展名为*.fltp的文件,我想使用ClickOnce部署。但我的清单中的文件关联部分似乎不起作用。

从我在C ++中编程的时间来看,我的理解是在Windows资源管理器中双击文件会导致Windows执行以下操作:

  1. 扫描注册表以查找文件扩展名(例如,*.doc
  2. 在注册表中发现文件扩展名已注册到命令行方案(在本例中为winword.exe %1
  3. 运行该命令行(即winword.exe "Untitled.doc")。

现在,ClickOnce不提供这种细粒度控制;在MSVS中,我只是转到出版物选项并将我的应用与*.fltp相关联。我假设它遵循将App.exe %1放入注册表的一般模式,并将我的应用程序写入该规范。

当我部署应用程序时,似乎应用程序已注册到*.fltp文件:它们的图标和描述发生了变化,在Windows资源管理器中双击它们会打开应用程序。

但命令行是空白的,所以我的应用程序只是打开一个空白的新文档!当我放入我的一个文件中时

Private Sub Init(sender As Object, e As EventArgs) Handles MyBase.Load
    MsgBox(Command)
End Sub

部署的应用程序只显示一个空消息框。 (如果我使用System.Windows.Forms.Messagebox.ShowSystem.Environment.GetCommandLineMy.Application.CommandLineArgs,则表示同样的行为 - 这不是遗留的传统VB函数。)

注册表项类似于C ++应用程序的注册表项,但不完全相同,所以我无法弄清楚它们的作用。

如何判断用户双击的文件?

vb.net command-line registry clickonce file-association
1个回答
1
投票

您已正确推断ClickOnce未将该文件作为命令行参数传递。

这里的问题是ClickOnce(通常)在应用程序启动时检查应用程序更新。因此,如果ClickOnce使用您为C ++应用程序描述的固定注册表架构,Windows可能会在命令行上启动带有文件位置的应用程序,ClickOnce意识到它需要更新应用程序,快速下载新的可执行文件并更新注册表,然后启动在新进程中更新可执行文件,意外地沿途压缩命令行。因此它将文件存储在Appdomain中,是否需要更新任何内容,然后在子项Appdomain中启动应用程序。

TL; DR:你想要AppDomain.CurrentDomain.SetupInformation.ActivationArguments.ActivationData而不是命令行。

© www.soinside.com 2019 - 2024. All rights reserved.