C#:同一应用程序中的WPF和命令行

C#:同一应用程序中的WPF和命令行,c#,wpf,command-line-interface,C#,Wpf,Command Line Interface,我有一个正在工作的WPF应用程序,我想用一些控制台功能对其进行eqip,以支持批处理。 为此,我从我的App.xaml中删除了StartupUri=“MainWindow.xaml”,并添加了一个基于命令行参数的编程调用,调用WPF或控制台应用程序。 这很好,只是有一个问题,控制台应用程序中的第一个Console.WriteLine()也会在命令行中显示二进制路径 我还有什么需要改变的吗 App.xaml.cs: using System; using System.Linq; using Sy

我有一个正在工作的WPF应用程序,我想用一些控制台功能对其进行eqip,以支持批处理。 为此,我从我的App.xaml中删除了
StartupUri=“MainWindow.xaml”
,并添加了一个基于命令行参数的编程调用,调用WPF或控制台应用程序。 这很好,只是有一个问题,控制台应用程序中的第一个
Console.WriteLine()
也会在命令行中显示二进制路径

我还有什么需要改变的吗

App.xaml.cs:

using System;
using System.Linq;
using System.Windows;
using System.Windows.Forms;

namespace AppNamespace
{
    public partial class App : System.Windows.Application
    {
        [System.Runtime.InteropServices.DllImport("kernel32.dll")]
        private static extern bool AllocConsole();
        [System.Runtime.InteropServices.DllImport("kernel32.dll")]
        private static extern bool FreeConsole();
        [System.Runtime.InteropServices.DllImport("kernel32.dll")]
        private static extern bool AttachConsole(int pid);

        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);

            if (e.Args.Contains("/c"))
            {
                // try to attach to an parent process console
                if (!AttachConsole(-1))
                {
                    // Alloc a new console
                    AllocConsole();
                }

                Console.WriteLine("Line 1");
                Console.WriteLine("Line 2");

                // get command prompt back
                SendKeys.SendWait("{ENTER}");

                // detach console
                FreeConsole();
            }
            else
            {
                new MainWindow().ShowDialog();
            }
            this.Shutdown();
        }
    }
}
App.xaml:

<Application x:Class="AppNamespace.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >
    <Application.Resources>

    </Application.Resources>
</Application>
需要我的命令行输出:

C:\TestProject\bin\Debug>testapp.exe /c

Line 1
Line 2

C:\TestProject\bin\Debug>

这是因为您的应用程序是Windows应用程序,而不是真正的控制台应用程序。从控制台启动Windows应用程序时,它不会等待应用程序退出,因此它只会在控制台中再次显示提示。我认为不可能同时具有控制台和Windows应用程序的应用程序。

如果在项目属性中将应用程序的输出类型从Windows应用程序更改为控制台应用程序,则可以在控制台中实现此行为

缺点是,如果直接启动WPF应用程序,您将获得一个新的控制台窗口。您可以使用前面提到的Win32调用隐藏此控制台窗口,但它仍然会很短地弹出


这样做的好处是,您不必再使用
AttachConsole/alloconsole/FreeConsole
附加到控制台,因为您已经在控制台中了。您还可以去掉
SendKeys.SendWait(“{ENTER}”)如果替换此.Shutdown()
环境。退出(0)

您是已经从命令行或powershell(附加)启动exe,还是仅在应用程序打开自己的控制台时启动exe?从Windows8.1开始,我观察到了类似的行为,我还可以在程序仍在生成输出时与控制台(键入命令)交互。
C:\TestProject\bin\Debug>testapp.exe /c

Line 1
Line 2

C:\TestProject\bin\Debug>