带有WinForm和控制台接口的.Net程序

时间:2014-08-06 19:30:37

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

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

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

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

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

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

我在VB中写这个,但如果对你来说更容易,我对C#解决方案同样感到满意。

谢谢!

5 个答案:

答案 0 :(得分:11)

通常情况下,我会将逻辑拆分为一个库,然后创建一个简单的控制台应用程序一个简单的Forms应用程序来调用库中的逻辑。

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

答案 1 :(得分:8)

您可以修改您的Program.cs以接受参数,然后如果某些args已经传递到您的应用程序中,并从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
    }
}

答案 2 :(得分:2)

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

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

答案 3 :(得分:2)

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();
    }

答案 4 :(得分:0)

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

优点: 您的应用程序正在由任务计划程序运行,因此您的表单不需要。 对于用户来说,可以轻松打开表单应用程序并更改将保存为xml的内容

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

2:你可以在一个表单中混合使用它,但它会在每天以形式为基础运行

相关问题