c# - 如何根据参数参数运行显示或不显示控制台窗口的 dotnet Core 控制台应用程序?

标签 c# .net-core console-application avaloniaui

我有一个 dotnet-core GUI 应用程序,根据参数参数,它可能只显示 GUI 界面(使用 Avalonia 框架完成),或者如果它收到一些特殊参数,则它应该在控制台模式下工作并登录控制台而不显示图形用户界面。
如果我使用 <OutputType>WinExe</OutputType> ,然后 GUI 显示正常,但应用程序永远不会登录到控制台(例如,在使用 Console.WriteLine("some-text") 时)。
这意味着我需要使用 <OutputType>Exe</OutputType> 配置 csproj为了能够登录控制台任何东西,问题是当在 GUI 模式下运行时,连同 GUI 应用程序窗口一起,另一个控制台窗口会弹出,我想隐藏它以仅显示 GUI。
在 dotnet full-framework 4.X 中,我能够创建 WPF 应用程序,在 1 个 exe 中执行此双控制台/gui 模式。
一个可能的解决方案是,如果我可以在 GUI 模式下运行时隐藏控制台窗口,或者 Avalonia-UI/dotnet-core 有其他一些方法可以做到这一点。
有谁知道如何做到这一点?
更新:以下是一些说明:
该应用程序有两种模式:

  • GUI模式 :如果您只是双击“App.exe”(不带 args 参数运行),那么应该会出现 GUI(并且只有 GUI,而不是 GUI 加上当前发生的另一个控制台窗口)。这通常可以通过将 csproj 设置为 <OutputType>WinExe</OutputType> 来完成。 ,但这使得 Console.Write功能在以下运行时不起作用Console Mode .
  • 控制台模式 :如果高级用户尝试使用控制台中的某些应用程序功能自动执行某些操作,则该应用程序的行为应该像控制台应用程序一样,具有人们期望的所有功能,例如 app.exe -h显示可用命令,app.exe -v显示版本等。这意味着不能显示一些手工制作的 GUI 窗口,显示输出文本或记录到文件中的任何其他地方。

  • 它可以在 2 个单独的可执行文件中完成,但是像我这样的一些人在只是一个简单的 app.exe 文件的应用程序中发现了一些美妙之处。
    这种双重行为有很多例子,比如 VisualStudio 的 devenv.exeNirsoft应用程序。

    最佳答案

    如果我说得对,您想在特殊参数和 WinForms 应用程序上启动控制台。
    首先你必须设置

    <DisableWinExeOutputInference>true</DisableWinExeOutputInference>
    
    在您的项目文件中。 See documentation
    尝试设置 <OutputType>返回 Exe并将其添加到您的程序> Main:
    static class Program
    {
        /// <summary>
        ///  The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            IntPtr h = GetConsoleWindow();
    
            // switch here to show or not show console window
            ShowWindow(h, 0);
            // ShowWindow(h, 1);
    
            Application.SetHighDpiMode(HighDpiMode.SystemAware);
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
    
            // Hide your WinForms application manually if parameter is set
            var startup = new MainFormStartup();
            Application.Run(startup.CreateForm<MainWindow>());
        }
    
        [DllImport("user32.dll")]
        static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
    
        [DllImport("kernel32.dll")]
        static extern IntPtr GetConsoleWindow();
    }
    
    我在本地尝试过
    <Project Sdk="Microsoft.NET.Sdk">
       <PropertyGroup>
          <OutputType>Exe</OutputType>
          <TargetFramework>net5.0-windows</TargetFramework>
          <UseWindowsForms>true</UseWindowsForms>
          <DisableWinExeOutputInference>true</DisableWinExeOutputInference>
       </PropertyGroup>
    </Project>
    
    但老实说,在我的选择中,您应该使用共享库编译两个 exe 文件,以完成控制台 exe 文件和 UI-exe 文件,例如:
    yourcode.csproj(您的业务逻辑)
  • yourapp-console.csproj(控制台应用程序:引用 yourcode.csproj)
  • yourapp-ui.csproj(WinForms 应用程序:引用 yourcode.csproj)
  • 关于c# - 如何根据参数参数运行显示或不显示控制台窗口的 dotnet Core 控制台应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65208298/

    相关文章:

    c# - 将 JSON 写入控制台

    c# 控制台应用程序 - 在不干扰其余执行代码的情况下运行 for(;;) 循环

    c# - 如何在 Simple Injector 中创建 Tagged Litetimes?

    c# - ServerManager,正在创建应用程序池,未设置身份

    c# - 使用 TFS 2015 分支链接文件

    docker - 如何在launchsettings.json中为docker设置ServicePort

    c# - EF Core 在每次迁移时更新种子数据而无需更改

    c - 如何禁用C中的关闭按钮?

    c# - DataBinding 和 Rebinding 有什么区别?

    c# - 如何使 .NET Core 6 顶级语句模板异步?