【问题标题】:.Net Program with both WinForm and Console Interfaces具有 WinForm 和控制台界面的 .Net 程序
【发布时间】:2014-08-06 19:30:36
【问题描述】:

我有一个简单的问题,我确信它已经得到解答,但我似乎找不到我正在寻找的解决方案。

我的基本问题是,我在 .Net 中创建了一个控制台应用程序,它每天在任务调度程序上自动运行,但现在我的客户还想要一个基于 Windows 窗体的界面,他们可以使用它来运行特殊的运行(他们使用 GUI 指定一些参数 - 例如特定日期等 - 以使程序运行有点不同)。

我想这样做的方法是将我的控制台应用程序转换为 WinForm 解决方案,并在我希望它作为具有默认值的原始控制台应用程序运行时包含命令行参数,但我认为这不是正确的方式,因为它仍然会涉及表单加载。

我的另一个想法是将“引擎”部分转换为 DLL 并制作 2 个可执行文件 - 一个是控制台应用程序,一个是 winforms 应用程序,但我不确定这是否正确/可能导致更多维护。

这样做的正确方法是什么?

我是用 VB 编写的,但如果 C# 解决方案对您来说更容易的话,我同样会感到满意。

谢谢!!

【问题讨论】:

  • 我很确定这是重复的。编辑:Found it.
  • 你可以按你说的做,不必加载任何表单,修改你的 Program.cs 以解析命令行,如果没有传递参数,则创建表单(即 Application.Run 行您的 Program.cs)。
  • @Jashaszun,感谢您找到另一个问题,我也看到了这个问题,但问题不是如何从表单应用程序显示控制台,而是要不要那样做。 ...正如您从我收到的解决方案中看到的那样,答案告诉了我该怎么做...谢谢!!!
  • @JohnBus​​tos 啊,我明白了。好吧,我没有将其标记为 dup,因为我认为它可能不是……现在我很高兴我没有。
  • @JohnBus​​tos 别担心,我不是来加分的,我喜欢帮助别人;)

标签: c# .net vb.net winforms console


【解决方案1】:

通常,我会将逻辑拆分到一个库中,然后制作一个简单的控制台应用一个简单的表单应用来调用库中的逻辑。

然后您可以单独分发它们并按预期使用它们,而无需重复代码。

【讨论】:

  • 非常感谢!! - 有了所有的赞成票,显然很多人都同意:)) - 所以,要理解,一个解决方案有 3 个项目?一个.dll、一个控制台应用和一个winform?
  • @JohnBus​​tos 没错。随着时间的推移,让生活变得更轻松,即使最初的设置工作量更大。您可以采取的“技巧”使其正常工作,否则通常会使表单体验不太理想。
  • 非常感谢!!! - 现在实施......太快接受您的解决方案作为最终答案,但只要允许我,我会......再次感谢!!!!
【解决方案2】:

您可以修改您的 Program.cs 以接受参数,然后如果某些参数已传递给您的应用程序处理它们并从 main 退出,否则启动您的主窗体,如下所示:

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main(string[] args)
    {

        if (ProcessCommandLine(args))
            return;

        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
    }

    static bool ProcessCommandLine(string[] args)
    {
         //Process it, if some has been processed return true, else return false
    }
}

【讨论】:

  • 您甚至可以创建一个控制台应用程序,添加对 System.Windows.Forms 的引用,然后执行 Application.Run(whateferformdoyouhave) XD。 Visual Studio 让人们认为 Windows 窗体应用与控制台应用的可执行类型不同,但它们完全相同,只是模板不同。
  • 古斯曼,真的是我想要的最佳解决方案! - 谢谢!!
【解决方案3】:

或者您可以使表单不可见并使用您的第一个选项,阅读命令行。

这是一种使初始形式不可见的方法。 Form Invisible

【讨论】:

  • 非常感谢@pposada! - 正是我正在寻找的,并且很乐意将其标记为解决方案,但古斯曼实际上早先在评论中发布了相同的想法,所以我让他让他的评论成为解决方案,因为这是第一个真正的解决方案,但我真的非常感谢你 - 这正是我所需要的!!!!
【解决方案4】:

Reed 建议的三个项目是一种正确的方法,但是如果您确实需要 1 个可执行文件(我们出于某种原因在一种情况下确实需要),您可以执行以下操作:

static class Program
{
    [STAThread]
    static void Main(string[] args)
    {
      if (args[0]== "-ui")
      {
         System.Windows.Forms.Application.EnableVisualStyles();
         System.Windows.Forms.Application.SetCompatibleTextRenderingDefault(false);
         System.Windows.Forms.Application.Run(new MyFormWork());
      }
      else if (args[0] == "-console")
      {
         Helper.AllocConsole();
         DoYourConsoleWork();
         Helper.FreeConsole();
      }
}

    public static class Helper
    {

        [DllImport("kernel32.dll")]
        public static extern Boolean AllocConsole();

        [DllImport("kernel32.dll")]
        public static extern Boolean FreeConsole();
    }

【讨论】:

    【解决方案5】:

    1:您可以使用 XML 作为参数。您的控制台只需要读取 XML 的参数即可。 然后创建一个仅用于编辑 XML 并保存的表单应用程序。

    好处: 您的应用程序由任务调度程序运行,因此您的表单不需要 . 对于用户来说,打开表单应用程序并更改将保存到 xml 的内容很容易

    Console --run every day without any notice
    Argument.xml  -- argument for Console .
    Form  -- user interface 
    

    2:您可以在一个表单中混合使用两者,但它会在表单库中每天运行,这不是一个好主意

    【讨论】:

      猜你喜欢
      • 2010-09-29
      • 2016-02-11
      • 2011-01-21
      • 1970-01-01
      • 2010-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-03
      相关资源
      最近更新 更多