具有WinForm和控制台界面的.Net程序

5

我有一个简单的问题,我相信它已经得到了答案,但我似乎找不到我要的解决方案。

我的基本问题是,我已经在 .Net 中创建了一个控制台应用程序,它会在任务计划程序上每天自动运行,但现在我的客户也希望有一个基于 Windows 窗体的界面,他们可以使用它来运行特定的操作(他们使用 GUI 指定一些参数 - 如特定日期等 - 以使程序以稍微不同的方式运行)。

我想到的方法是将我的控制台应用程序转换为 WinForm 解决方案,并包含命令行参数,以便在需要使用默认设置运行原始控制台应用程序时使用,但我认为这不是正确的方法,因为它仍然涉及窗体加载。

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

哪种方法才是正确的?

我用 VB 写这篇文章,但如果你觉得用 C# 更容易,我也很熟悉。

谢谢!


3
您可以按照自己说的去做,并且不必加载任何表单。修改您的Program.cs以解析命令行,如果没有传递参数,则创建表单(这是在您的Program.cs中的Application.Run行)。 - Gusman
@Jashaszun,谢谢你找到了那个相关问题。我也看到了那个问题,但是问题不是如何从表格应用程序中显示控制台,而是是否要这样做……正如你可以从我得到的解决方案中看到的那样,答案告诉了我该怎么做……不过还是谢谢你! - John Bustos
@JohnBustos 哦,我明白了。嗯,我没有将这个标记为重复,因为我认为它可能不是...现在我很高兴我没有这样做。 - Jashaszun
@Gusman - 这也是一个很棒的想法!!!可能比我之前与Reed讨论的多项目解决方案还要简单!!谢谢!- +1 - John Bustos
1
@JohnBustos 不用担心,我不是来赚积分的,我喜欢帮助人们 ;) - Gusman
显示剩余3条评论
5个回答

12
通常,我会将逻辑分成一个库,然后创建一个简单的控制台应用程序和一个简单的窗体应用程序来调用库中的逻辑。
您可以将它们分别分发并按原意使用,而不会重复编写代码。

非常感谢!!- 通过所有的赞,显然许多人都同意 :) - 那么,理解一下,一个解决方案有3个项目吗?一个.dll,一个控制台应用程序和一个winform? - John Bustos
1
@JohnBustos 没错。尽管最初的设置需要更多的工作,但随着时间的推移,它会让生活变得更加容易。你可以做一些“黑科技”来使其以其他方式工作,但这通常会使表单体验不太理想。 - Reed Copsey
非常感谢!!!- 现在正在实现...太快了,不能立即接受您的解决方案作为最终答案,但是一旦SO允许我,我会的...再次感谢!!! - John Bustos

9
你可以修改你的 Program.cs 来接受参数,如果有一些参数已经被传递给你的应用程序,则处理它们并从主函数退出;否则,启动你的主窗体。代码示例如下:

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
    }
}

1
你甚至可以创建一个控制台应用程序,添加对System.Windows.Forms的引用,然后执行Application.Run(你所拥有的任何窗体) XD。Visual Studio让人们认为Windows窗体应用程序与控制台应用程序不是相同的可执行文件类型,但它们实际上是完全相同的,只是使用了不同的模板。 - Gusman
Gusman,真的是我想要的最好的解决方案!- 谢谢!! - John Bustos

2
您可以将表单设为不可见,选择读取命令行的第一项。
以下是使初始表单不可见的方法:表单不可见

非常感谢您,@pposada!! - 这正是我正在寻找的,我很乐意将其标记为解决方案,但Gusman实际上早在评论中就发布了相同的想法,所以我提供给他将他的评论作为解决方案,因为它是第一个真正的解决方案,但我真的无法感谢你足够了 - 这正是我需要的!!! - John Bustos

2

Reed建议的三个项目是正确的方法,但如果您真的需要一个可执行文件(在某些情况下我们确实需要),可以按照以下步骤进行:

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

0

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

好处: 你的应用程序通过任务计划程序运行,因此你的表单不需要运行。 对于用户来说,打开表单应用程序并更改一些内容很容易,这将保存到 XML 中。

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

2:你可以在一个表单中混合使用,但它将每天在表单基础上运行,这不是一个好主意。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接