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

C# 是否可以在控制台窗口中运行Windows应用程序?,c#,.net,wpf,c#-4.0,console,C#,.net,Wpf,C# 4.0,Console,我有一个用C#4和WPF编写的Windows应用程序;现在有人问我是否可以添加命令行参数(例如/console),强制它作为控制台应用程序运行,以便它可以由任务调度器运行 现代应用程序是否可能做到这一点?或者我需要创建一个单独的控制台应用程序吗 更新:我可以强调一下,这是一个WPF应用程序。没有方便的静态void Main(字符串[]args)入口点可供挂钩。但是PM仍然希望应用程序能够从命令行运行 最终更新:正如@RodH257所指出的,诀窍在于WPF应用程序代码生成预期的静态void Mai

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

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

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


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

您可以使用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 
    }

是的,Windows GUI应用程序与控制台应用程序一样有一个
Main
。因此,诀窍是在启动UI循环之前进行一些预处理
Main
。需要注意的是,如果您想从Visual Studio中编译为.NET“Windows应用程序”的应用程序中使用控制台,则必须手动使用,因为默认情况下不会获得控制台


讨论有关“混合控制台/GUI应用程序”的更多信息。

这完全取决于程序最初的编写方式


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

这里有一个例子。构建类型很重要。您的编译器只允许您有一个构建目标(例如GUI、命令行)。

如果它由任务调度器运行,您根本不需要任何屏幕。删除startupuri并根据命令行手动启动windows


如果是控制台启动的进程,只需执行您需要的任何处理。否则,启动windows…

您可以将其转换为控制台应用程序并手动显示第一个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应用程序,没有一个方便的主入口点。我已经更新了我的答案,以便更清楚。创建一个控制台应用程序项目作为入口点,然后创建一个新的窗口实例。非常感谢-您的链接指向了最佳解决方案(方法#3,如果您想知道的话)。根据您的建议,我发现,但是我发现,如果我尝试调用Console.WriteLine,则不会显示任何输出。我需要使用log4net之类的工具来获取输出吗?这就是我想要在后台运行的基于服务器的东西所要做的。。。。或者有时将某些内容登录到数据库。不幸的是,如上所述,该应用程序是WPF应用程序,没有方便的主入口点。不幸的是,如上所述,该应用程序是WPF应用程序,没有方便的主入口点。仅供参考:我刚刚写了一篇关于如何打开WPF窗口的博文,并隐藏/显示控制台窗口。信息到处都是,所以我决定在我自己的项目中发布我是如何让它工作的:
 static class Program
{
    static void Main(params string[] args)
    {
        if (args.Length > 0)
        {
           //do stuff here
            return;
        }
          Window1 window = new Window1();
          window.ShowDialog();
    }
}