【问题标题】:Running Windows Forms Application (C# .NET 4.0) from batch file with Command Line Arguments使用命令行参数从批处理文件运行 Windows 窗体应用程序 (C# .NET 4.0)
【发布时间】:2011-09-03 17:44:12
【问题描述】:

我是一名 Silverlight/ASP.NET 开发人员,试图编写我的第一个 Windows 窗体应用程序以在服务器的后台运行,填充我们的数据库。最终希望这是一项 Windows 服务,但最初不是必需的。

我需要创建一个批处理文件来执行该应用程序的 5 个实例,将 URL 传递给 5 个 RESTful 端点。所以我发布了我的应用程序,它创建了一个 setup.exe。安装后,我有一个指向

的项目

C:\Users\mi2dev\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Microsoft\,带有 .appref-ms 文件。

我现在不确定该怎么做。运行:

"C:\Users\mi2dev\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Microsoft\StreamingApp.appref-ms" -"http://www.myURL.com" 短暂弹出命令窗口,但应用程序未运行,数据未填充到数据库中。

我在这里错过了什么?

【问题讨论】:

  • ClickOnce 部署在这种情况下不合适。您需要将可执行文件复制到众所周知的位置,以便可靠地找到它。传递命令行参数也不再是问题。

标签: c# winforms deployment


【解决方案1】:

因为您的应用程序是 .exe 格式。并使您的 winform 接受命令行参数(检查 main 方法)也使您的 Form ctor 也接受参数。然后就像其他命令一样通过 cmd 行启动它,但这里只是导航到文件所在的那个目录。

如果是批处理,请使用启动命令,后跟程序名称,然后是参数

【讨论】:

  • 不,他不需要添加参数化构造函数。所有 .NET 控制台和 windows 窗体应用程序都从静态 main 方法开始,当然您不能直接从批处理文件中调用窗体构造函数。
  • 我的 Program.cs 在构造函数中有 string[] args。然后我将该参数传递给我的 Form.cs 构造函数。 Program.cs 接受来自命令行的参数(理论上)。在 Main 方法中,它创建了我的 Form1 的一个实例,并传入了参数。我在 Program.cs 中抛出了一个“messagebox.show”,它工作正常。
  • @Davide Piras 先生,你误会我了。我的意思是,通过 Application.Run(new Form(..)) 将参数传递给 main 然后从 main 传递给 Forms ctor :)
  • @Scott Silvi 如果您可以通过命令行(cmd.exe 方式)启动您的应用程序,例如 $myapplication.exe "this is argument" 并且您的应用程序启动时会根据您的消息框显示参数,那么同样应该使用 start 命令将其放入批处理文件中
  • 我不知道EXE在哪里。我试图从我的 bin\debug 文件夹运行 exe,但应用程序在尝试连接到我的数据库时抛出错误(我的连接字符串代码在 ConfigurationManager.ConnectionStrings["myConnString"].ConnectionString 上抛出空异常
【解决方案2】:

很难理解您的应用程序内部发生了什么。当它接收到给定的参数时,您需要调试以了解那里发生了什么。 所以我建议调试一个EXE。为此,请转到您的EXE 项目属性,在CommandLineArguments 中选择DEBUG 选项卡,插入您的参数字符串。 在DEBUG 中运行它,希望你能找出问题所在。

如果调试后还不清楚为什么会这样,请回到 SO :)

【讨论】:

  • 我必须禁用“启用 ClickOnce 安全设置”才能运行命令行参数,但一旦我这样做了,应用程序就运行良好。就像我说的,应用程序本身可以正常运行,我只是不确定如何从批处理文件中执行它
  • @Scott,所以您说如果您在此框中输入命令行参数并运行应用程序,它会起作用吗?
  • 是的,我只是不知道如何或在哪里运行应用程序,例如“C:\ProgramFiles\MyApp\MyApp.exe”“myURL”。我对 ClickOnce 不够熟悉,不知道在这里做什么,谷歌搜索也没有用:(
【解决方案3】:

Silvi 如果您打算从批处理文件中使用 Windows 窗体应用程序,并且您认为应用程序在这种模式下的行为与双击打开时的行为不同,通常的方法是解析命令行(参数,也可在main 方法作为参数)并完全避免加载 UI。

事实上,如果您正确编写了应用程序,那么 UI 只管理 UI,并不包含数据库操作和数据转换的整个逻辑。

你可以做的是检查 Main 方法内部是否有命令行参数,如果你检测到任何你定义的特殊参数,你真的避免调用 Application.Run(new Form1(...)); 并开始在没有用户界面的批处理模式下工作。

您想在批处理模式或 UI 模式中使用的相同逻辑可以包装在帮助程序类中(通常也称为业务管理器或业务逻辑......这取决于),这样您就没有代码重复,而只是 UI或者批处理会很好地调用这些类。

【讨论】:

  • 在特殊的 1 或非法参数的情况下为真 :)
  • 在某些时候我想要一些 UI 内置,所以我可以创建一些跟踪/BI 代码。
猜你喜欢
  • 2021-07-15
  • 2013-11-26
  • 2017-11-30
  • 1970-01-01
  • 1970-01-01
  • 2012-12-26
  • 2013-08-07
  • 1970-01-01
  • 2012-03-08
相关资源
最近更新 更多