【问题标题】:Is it possible to run a Windows app within a console window?是否可以在控制台窗口中运行 Windows 应用程序?
【发布时间】:2011-12-06 02:59:57
【问题描述】:

我有一个用 C# 4 和 WPF 编写的 Windows 应用程序;现在有人问我是否可以添加一个命令行参数(例如 /console)来强制它作为控制台应用程序运行,以便它可以由任务调度程序运行。

现代应用程序可以做到这一点吗?还是我需要创建一个单独的控制台应用程序?

UPDATE:我能否强调这是一个WPF 应用程序。没有方便的static void Main(string[] args) 入口点可以挂接。但是 PM 仍然希望应用能够从命令行运行...

最终更新:正如@RodH257 所指出的,诀窍在于 WPF 应用程序代码生成了预期的静态 void Main。您可以使用同名方法添加自己的类,并在项目构建属性中,将其设置为可执行文件的启动对象。您还需要该方法的 [STAThread] 属性,以便 WPF 也能正常运行。

【问题讨论】:

  • 仅供参考:刚刚写了一篇关于我如何打开 WPF 窗口以及隐藏/显示控制台窗口的巨大帖子。信息到处都是,所以我决定发布我是如何在我自己的项目中工作的:stackoverflow.com/questions/479014/…

标签: c# .net wpf c#-4.0 console


【解决方案1】:

是的,Windows GUI 应用程序具有Main,就像控制台应用程序一样。所以诀窍是在开始 UI 循环之前对Main 进行一些预处理。应该注意的是,如果您想在 Visual Studio 中编译为 .NET“Windows 应用程序”的应用程序中使用控制台,则必须手动 AllocConsole,因为默认情况下您不会得到一个。

This MSDN forum thread 讨论了更多关于“混合控制台/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 应用程序,没有方便的 Main 入口点。
    【解决方案3】:

    您可以将其转换为控制台应用程序并手动显示第一个 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 项目的入口点并根据参数执行操作 How to write custom Main method for a WPF application?

    编辑: 更新了帖子,以更清楚地描述所描述的确切情况。

    【讨论】:

    • 不幸的是,该应用程序是 WPF 应用程序,没有方便的 Main 入口点。
    • 我已经更新了我的答案,使其更加清晰。创建一个控制台应用程序项目作为您的入口点,然后创建一个新的窗口实例。
    • 非常感谢 - 您的链接指向了最佳解决方案(方法 #3,如果您想知道的话)。
    【解决方案4】:

    这在很大程度上取决于程序最初是如何编写的。

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

    【讨论】:

      【解决方案5】:

      如果它由任务调度程序运行,您根本不需要任何屏幕来显示。删除 startupuri 并根据命令行手动启动窗口。

      如果它是控制台启动的进程,只需执行您需要的任何处理。否则,启动你的窗口...

      【讨论】:

      • 根据您的建议,我找到了dutton.me.uk/2011/02/21/…,但是我发现如果我尝试调用 Console.WriteLine 则不会出现任何输出。我是否必须使用 log4net 之类的东西才能获得输出?
      • 这就是我倾向于在后台运行的基于服务器的事情......或者有时将某些内容记录到数据库中。
      【解决方案6】:

      这是article/code sample showing how it's done。构建类型很重要。您的编译器只允许您拥有一个构建目标(例如,GUI、命令行)。

      【讨论】:

      • 不幸的是,该应用程序是 WPF 应用程序,没有方便的 Main 入口点。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-23
      • 1970-01-01
      • 2012-03-26
      • 2010-11-19
      • 2011-02-25
      • 1970-01-01
      • 2023-04-04
      相关资源
      最近更新 更多