能否在控制台窗口中运行Windows应用程序?

4
我有一个用C# 4和WPF编写的Windows应用程序;现在我被要求添加一个命令行参数(例如/console),以便强制其作为控制台应用程序运行,以便由任务计划程序运行。
这对于现代应用程序来说是否可能?还是我需要创建一个单独的控制台应用程序?
更新:请注意,这是一个WPF应用程序。没有方便的static void Main(string[] args)入口点可以挂钩。但PM仍希望该应用程序具有从命令行运行的能力...
最终更新:正如@RodH257指出的那样,诀窍在于WPF应用程序会自动生成预期的static void Main。您可以添加自己的类,并使用相同名称的方法,并在项目生成属性中将其设置为可执行文件的启动对象。您还需要在方法上添加[STAThread]属性,以便WPF也能正常运行。

FYI:我刚写了一篇关于如何打开WPF窗口并隐藏/显示控制台窗口的大型帖子。这些信息分散在各个地方,所以我决定发布我自己项目中的解决方法:https://dev59.com/03RB5IYBdhLWcg3w4bGv#33441726 - James Wilkins
6个回答

4
是的,Windows GUI应用程序和控制台应用程序一样也有一个Main。因此,在启动UI循环之前需要进行一些预处理Main的技巧。需要注意的是,如果您想从Visual Studio中编译为.NET“Windows应用程序”的应用程序中使用控制台,则必须手动AllocConsole,因为默认情况下不会得到控制台。 这个MSDN论坛主题讨论了更多关于“混合控制台/GUI应用程序”的内容。

2
你可以使用dos命令从控制台应用程序中启动它,但是,除非你修改启动例程(在Main()中),否则它将加载和显示主窗口... 如果你不希望显示主窗口,只需重新编写主例程,使Main()参数禁用该选项...

而不是这样:

    [STAThread]
    static void Main()
    {
       Application.Run(new MainForm());
    }

编写这段代码:

    [STAThread]
    static void Main(params string[] args)
    {
         if(args.length <= 1)
              Application.Run(new MainForm());
         else if (args[1].StartsWith("C")) // "C" for "C"onsole version
              // Do whatever needs to be done to start 
              //    functionality for console app version 
    }

然后,当你运行它时,添加/C开关:
   C:\MyCurrentDirectory>MyWinFormsApplicationName.exe /C

很不幸,正如所述,该应用程序是一个WPF应用程序,没有方便的主入口点。 - David Keaveny

1

你可以将它转换为控制台应用程序,并手动显示第一个 WPF 对话框。就像创建 DLL 并启动 WPF 窗口一样,如下所示:

 static class Program
{
    static void Main(params string[] args)
    {
        if (args.Length > 0)
        {
           //do stuff here
            return;
        }
          Window1 window = new Window1();
          window.ShowDialog();
    }
}

或者,您可以查看此链接以编辑当前 WPF 项目的入口点,并根据参数进行操作 如何为 WPF 应用程序编写自定义 Main 方法?

编辑: 更新了帖子,以使描述的确切情况更清晰。


很不幸,正如所述,该应用程序是一个WPF应用程序,没有方便的主入口点。 - David Keaveny
我已更新我的答案以便更清晰。将Console Application项目创建为你的入口点,然后新建一个Window实例。 - RodH257
非常感谢 - 你的链接指向了最佳解决方案(如果你想知道的话,是第三种方法)。 - David Keaveny

0

这非常取决于程序最初是如何编写的。

如果您以松散耦合的方式编写了逻辑,您可以创建另一个控制台应用程序并在那里重用您的逻辑。这需要手动编程/重构工作。


0
如果它被任务计划程序运行,你根本不需要任何屏幕出现。删除启动URI并根据命令行手动启动Windows。
如果它是一个控制台启动的进程,只需进行所需的任何处理。否则,启动你的Windows...

受到您的建议启发,我找到了http://www.dutton.me.uk/2011/02/21/how-to-handle-command-line-arguments-in-wpf-applications/,但是我发现如果我尝试调用Console.WriteLine,则没有输出出现。我需要使用类似log4net的东西来获取输出吗? - David Keaveny
这是我倾向于为基于服务器的后台运行的事情所做的...或者有时将某些内容记录到数据库中。 - Keith Nicholas

-1

很遗憾,正如所述,该应用程序是一个WPF应用程序,没有方便的主入口点。 - David Keaveny

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