【问题标题】:Command line arguments using in Windows form以 Windows 形式使用的命令行参数
【发布时间】:2016-02-20 04:32:14
【问题描述】:

我有 C# Windows 窗体应用程序,我正在做很多复选框并将它们写入和读取到名为 test.json 的 JSON 格式文件。现在我想将我的 test.json 与 program.exe 一起使用,这样我的 program.exe 将被选中,如 test.json 中所写。所以我创建了Load event handler 并想使用我的GetCommandLineArgs()

private void Form1_Load(object sender, EventArgs e)
{
    string[] args = Environment.GetCommandLineArgs();            
}

我知道我有 2 个参数。[0] - program.exe[1] - test.json。需要一些想法如何让它发挥作用。

我的问题是:

如何制作包含 2 个元素的 args 列表。其中 0 是 program.exe,1 是 test.json。以及当可能没有参数或只有一个参数时如何使用 args.length

【问题讨论】:

  • second 参数中发送json file path
  • 你的意思是 var path = args [1] ?

标签: c# winforms command-line-arguments


【解决方案1】:

如何制作包含 2 个元素的 args 列表。其中 0 是 program.exe,1 是 test.json

为此,您可以通过打开项目属性窗口并导航到“调试”选项卡在 Visual Studio 中进行调试,您可以在其中指定所需的命令行参数,如下所示:

您可以使用Environment.GetCommandLineArgs(),我认为这有点奇怪。它为您提供当前正在运行的可执行文件名称。所以在你的情况下,你最终会得到你想要的。

[0] - program.exe and [1] - test.json

当可能没有参数或只有一个参数时如何使用 args.Length。

这很简单,Environment.GetCommandLineArgs() 返回一个string[]。检查所需的长度并进行相应的处理。

var commandLineArgs = Environment.GetCommandLineArgs();
if (commandLineArgs.Length > 0)
{
    // Do something magical...
}
else
{
    // Nothing was passed in...
}

【讨论】:

  • 有没有可能不接触主方法?我想要该 Load 事件处理程序中的所有内容。还有一个问题如何处理?如果我知道我的 args.Length = 1 没有给出参数并且 args.Length = 2 ,只给出了一个参数。
  • 感谢它提供的非常丰富的信息和帮助,但是当我使用我的命令行时,它只是简单地运行我的 program.exe,没有任何特别的事情发生。也许我做错了什么?即使我只放了 program.exe 或者我也放了 test.json 它只是简单地运行 program.exe。
  • 我相信我确实正确回答了您的具体问题,话虽如此。听起来您可能还有其他一些问题——也许,test.json 文件丢失或在本地找不到,或者其他什么。我建议您接受此答案,并针对您遇到的其他问题创建另一个答案。
  • 好的,最后一个问题。我正在一个目录中进行编码,而我将 program.exe 和 test.json 放在其中的项目位于另一个目录中。这会影响我的问题吗?
  • 是的,这是一个问题... test.json 文件必须位于执行 program.exe 的同一目录中,除非您完全限定文件路径。如果您认为它是正确的,请接受我的回答。
【解决方案2】:

类似这样的:

var cmdArgs = Environment.GetCommandLineArgs();

if (cmdArgs.Length < 2) 
{
    MessageBox.Show("No JSON file specified!");
}

var jsonFilename = cmdArgs[1];

如果您进行更复杂的命令行参数解析,我建议使用现有的库,例如 this one

更新:

您可以在此处附加您的事件处理程序(或通过双击创建一个新的):

【讨论】:

  • 我喜欢你提供的 :) 但是当我使用我的命令行时,它的工作方式与没有 Getcommandline() 相同。它使我的程序运行简单。也许我做错了什么?
  • 你看过调试器了吗?请参阅 David Pines 回答如何在 Visual Studio 的“调试”中设置命令行参数。然后在var cmdArgs = .... 上设置断点。你把你的参数放在那里了吗?
  • 我已经在 Winforms 应用程序中测试了上述代码。如果您将其放入 FormLoad 事件处理程序中,则可以按预期工作。究竟是什么问题?
  • 我认为我的问题是我不知道如何让我的事件持有者加载。它应该类似于this.Load += Form1_Load;
  • 是的,没错。您无需编码即可做到这一点:在设计器中选择表单。到“属性”(F4)并切换到“事件”选项卡并搜索名为“加载”的事件。从下拉列表中选择您的 Form1_Load() 方法。如果你还没有:双击输入框,Visual Studio 会为你创建一个新的并注册到+=
猜你喜欢
  • 1970-01-01
  • 2016-10-06
  • 1970-01-01
  • 2012-04-10
  • 2013-01-03
  • 2018-11-10
  • 2010-09-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多