我正在开发一个VB.NET Windows Forms应用程序来编辑扩展名为*.fltp
的文件,我想使用ClickOnce部署。但我的清单中的文件关联部分似乎不起作用。
从我在C ++中编程的时间来看,我的理解是在Windows资源管理器中双击文件会导致Windows执行以下操作:
*.doc
)winword.exe %1
)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.Show
,System.Environment.GetCommandLine
或My.Application.CommandLineArgs
,则表示同样的行为 - 这不是遗留的传统VB函数。)
注册表项类似于C ++应用程序的注册表项,但不完全相同,所以我无法弄清楚它们的作用。
如何判断用户双击的文件?
您已正确推断ClickOnce未将该文件作为命令行参数传递。
这里的问题是ClickOnce(通常)在应用程序启动时检查应用程序更新。因此,如果ClickOnce使用您为C ++应用程序描述的固定注册表架构,Windows可能会在命令行上启动带有文件位置的应用程序,ClickOnce意识到它需要更新应用程序,快速下载新的可执行文件并更新注册表,然后启动在新进程中更新可执行文件,意外地沿途压缩命令行。因此它将文件存储在Appdomain
中,是否需要更新任何内容,然后在子项Appdomain
中启动应用程序。
TL; DR:你想要AppDomain.CurrentDomain.SetupInformation.ActivationArguments.ActivationData
而不是命令行。