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

时间:2019-02-24 22:24:47

标签: vb.net command-line registry clickonce file-association

我正在开发一个VB.NET Windows窗体应用程序,以编辑扩展名为*.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 ++应用程序的注册表项相似,但不完全相同,因此我无法弄清楚它们的作用。

如何确定用户双击哪个文件?

1 个答案:

答案 0 :(得分:1)

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

这里的问题是ClickOnce(通常)在应用启动时立即检查应用更新。因此,如果ClickOnce使用了您为C ++应用程序描述的固定注册表架构,则Windows可能会在命令行中使用文件位置启动应用程序,ClickOnce意识到它需要更新应用程序,快速下载新的可执行文件并更新注册表,然后启动在一个新的过程中更新了可执行文件,不小心挤压了命令行。因此,它将文件存储在Appdomain中,进行必要的更新,然后在子Appdomain中启动应用程序。

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