【问题标题】:Opening file association starts ClickOnce application with blank command line打开文件关联使用空白命令行启动 ClickOnce 应用程序
【发布时间】:2019-02-24 22:24:47
【问题描述】:

我正在开发一个 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++ 应用程序的注册表项相似,但并不完全相同,因此我无法弄清楚它们的作用。

我如何知道用户双击了哪个文件?

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-04-27
      • 1970-01-01
      • 1970-01-01
      • 2010-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多