我正在开发一个VB.NET Windows窗体应用程序,以编辑扩展名为*.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 ++应用程序的注册表项相似,但不完全相同,因此我无法弄清楚它们的作用。
如何确定用户双击哪个文件?
答案 0 :(得分:1)
您已正确推断ClickOnce不会将文件作为命令行参数传递。
这里的问题是ClickOnce(通常)在应用启动时立即检查应用更新。因此,如果ClickOnce使用了您为C ++应用程序描述的固定注册表架构,则Windows可能会在命令行中使用文件位置启动应用程序,ClickOnce意识到它需要更新应用程序,快速下载新的可执行文件并更新注册表,然后启动在一个新的过程中更新了可执行文件,不小心挤压了命令行。因此,它将文件存储在Appdomain
中,进行必要的更新,然后在子Appdomain
中启动应用程序。
TL; DR:您需要AppDomain.CurrentDomain.SetupInformation.ActivationArguments.ActivationData
而不是命令行。