C#:根据交换机,是否可以将单个应用程序用作控制台或Windows应用程序?

Svi*_*ish 8 c# windows console-application

我有一个简单的应用程序,我希望通过交换机自动化.但是,当我通过开关运行它时,我真的不希望显示用户界面.我只是想让它运行,做它的工作,在控制台中打印出东西,然后退出.另一方面,如果我不使用任何开关运行它,我希望弹出用户界面.在这种情况下,我真的不希望在后台闲置一个控制台窗口.

有什么方法可以做到这一点,还是我必须创建两个单独的项目,一个控制台应用程序和一个Windows应用程序?

adr*_*nks 11

虽然不完全是你所问的,但我过去通过使用FreeConsole pInvoke删除控制台窗口来实现这种行为的外观.

您将项目的输出类型设置为控制台应用程序.然后,您可以定义extern调用FreeConsole:

[DllImport("kernel32.dll", SetLastError=true)]
private static extern int FreeConsole();
Run Code Online (Sandbox Code Playgroud)

然后,在您的Main方法中,您可以根据您的条件进行切换.如果您需要UI,请FreeConsole在打开表单之前调用以清除控制台窗口.

if (asWinForms)
{
    FreeConsole();       
    Application.Run(new MainForm());
}
else
{
    // console logic here 
}
Run Code Online (Sandbox Code Playgroud)

控制台窗口在启动时会短暂出现,但在我的情况下可以接受.

虽然这有点黑客并且有难闻的气味,所以我会认真考虑你是否想沿着这条路走下去.


Aar*_*ron 8

'旧的新事物'

如何编写可以作为控制台或GUI应用程序运行的程序?

你不能.

(我会让你点击文章了解如何伪造它的细节)


Cha*_*ana 6

当然,根据命令行中传递的参数,只需在静态main(string [] args)中放置一个switch语句(或if else构造).我这样做也可以在执行服务或控制台之间切换......

注意:将项目类型设置为Console App

[DllImport("kernel32.dll", SetLastError=true)]
private static extern int FreeConsole();    
[STAThread]
static void Main(string[] args)
        {
            if (args.Length == 0 && args[0] == "C") // Console
            {                    
                // Run as console code  
                Console.WriteLine("Running as Console App");
                Console.WriteLine("Hit any Key to exit");
                Console.ReadLine();
          }
            else
            {
                //Console.SetWindowSize(1,1);
                //string procName = Assembly.GetExecutingAssembly().FullName;
                //ProcessStartInfo info = new ProcessStartInfo(procName );
                //info.WindowStyle = ProcessWindowStyle.Minimized;

                // EDIT: Thanks to Adrian Bank's answer - 
                // a better approach is to use FreeConsole()
                FreeConsole();
                Application.Run(new MyForm());
            }
        }
Run Code Online (Sandbox Code Playgroud)

编辑:感谢Adrian Bank的回答,FreeConsole()是一个更好的方法来"分配"控制台窗口而不是最小化它...

  • 我想人们会投票,因为它不是真正的控制台应用程序(根据Raymond Chen的说法,这些是不可能的:http://blogs.msdn.com/oldnewthing/archive/2009/01/01/9259142.aspx),但我认为方法适用于OP的问题.我只是认为IF条件是完全错误的 - 应该是|| 我认为. (2认同)
  • 如果您从Windows应用程序执行此操作,则无法访问stdin和stdout来读取或写入控制台的内容.如果您将exe标记为控制台应用程序,则会有一个控制台. (2认同)