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

时间:2011-12-06 02:59:58

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

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

现代应用程序可以实现吗?或者我是否需要创建一个单独的控制台应用程序?

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

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

6 个答案:

答案 0 :(得分:4)

是的,Windows GUI应用程序的Main就像一个控制台应用程序。所以诀窍是在开始UI循环之前做一些预处理Main。应该注意的是,如果要在Visual Studio中编译为.NET“Windows应用程序”的应用程序内部使用控制台,则必须手动AllocConsole,因为默认情况下不会获得一个。 / p>

This MSDN forum thread讨论了更多关于“混合控制台/ GUI应用程序”的内容。

答案 1 :(得分: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

答案 2 :(得分: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项目的入口点并根据参数进行操作 How to write custom Main method for a WPF application?

编辑: 更新了帖子,以便更清楚地了解所描述的具体情况。

答案 3 :(得分:0)

这极大地取决于程序最初的编写方式。

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

答案 4 :(得分:0)

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

如果它是一个控制台启动过程,只需做你需要的任何处理。否则,启动你的窗户......

答案 5 :(得分:-1)

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