【问题标题】:Passing command line argument to WinForm works in Debug mode but not after publish将命令行参数传递给 WinForm 在调试模式下有效,但在发布后无效
【发布时间】:2013-04-07 09:37:23
【问题描述】:

我有一个 WinForms 应用程序,它通过调用 Environment.GetCommandLineArgs() 接受命令行参数并对其进行处理。

它在调试模式下工作正常 - 我在项目属性的调试选项卡中输入参数,然后运行它 (F5) 并且应用程序正确获取参数。

但在我发布应用程序并尝试使用此代码行从另一个 Winform 应用程序调用它之后:

Process.Start("\\path\to\myApp\MyApp.application", "4")

它不起作用。显然,由于某种原因,该参数没有传递给应用程序,我不知道为什么。我还尝试创建一个新进程并在启动它之前设置它的ProcessStartInfo.Arguments,但它仍然不起作用。

谁能帮帮我?

更新

在我看来,当调用Process.Start("\\path\to\etc", "4") 时,实际运行的是我机器上程序的本地副本,位于C:\users\myUserName\AppData\Local\App\2.0\long-string-of-digits-and-letters\MyA‌​pp.exe。如果我改为运行 Process.Start("C:\users\etc", "4") - 它可以工作

现在我的问题是 - 为什么在运行 Process.Start("\\path\to\etc", "4") 时没有将参数传递给程序的本地副本?我应该怎么做才能将参数传递给本地副本?

【问题讨论】:

  • GetCommandLineArgs 返回一个字符串数组,其中第一个元素是程序的名称,从第二个索引开始是参数。您确定在应用程序中获得了正确的索引吗?你能说明你是如何处理这个论点的吗?
  • 通过输出Environment.CommandLine 的结果,尝试按照史蒂夫建议的方式进行调试。你在这两种情况下看到了什么?如果有的话,它有什么不同?
  • @Steve 我知道。我先检查Environment.GetCommandLineArgs().Length > 1看是否有参数,然后使用Environment.GetCommandLineArgs()(1)得到它。
  • 我注意到 0-index 参数(程序路径)似乎类似于C:\users\myUserName\AppData\Local\App\2.0\long-string-of-digits-and-letters\MyApp.exe,这与Process.Start() 中的\\path\to\myApp\MyApp.application 不同。我不知道这对我的问题是否重要和/或相关。

标签: vb.net winforms command-line-arguments process.start


【解决方案1】:

好的,正如我在问题更新中所写,问题出在链接中。大概.application 文件在我的机器上运行了本地.exe 文件,但由于某种原因没有将参数传递给它。我不得不直接打开本地的.exe文件。

为了解决这个问题,我按照以下几行添加了代码(为简洁起见,省略了验证/异常处理逻辑):

Dim path As String = Environment.GetEnvironmentVariable("LOCALAPPDATA") & "\apps\2.0"
Dim files() As String = Directory.GetFiles(path, "MyApp.exe", IO.SearchOption.AllDirectories)
Process.Start(files(0), "4")

不是最佳解决方案(因为它假定本地 .exe 文件位于 %LOCALAPPDATA%\apps\2.0 的某个子文件夹中),但至少它解决了我的问题...

【讨论】:

    猜你喜欢
    • 2019-03-18
    • 2016-05-20
    • 2012-01-19
    • 1970-01-01
    • 2014-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-14
    相关资源
    最近更新 更多