簡體   English   中英

如何根據參數參數運行顯示控制台 window 的 dotnet Core 控制台應用程序?

[英]How to run dotnet Core console application that shows the console window or not based on argument parameters?

我有一個 dotnet-core GUI 應用程序,根據參數參數,它可能只顯示 GUI 界面(使用 Avalonia 框架完成),或者如果它收到一些特殊的 arguments 那么它應該在控制台模式下工作並登錄控制台而不顯示圖形用戶界面。 如果我使用<OutputType>WinExe</OutputType> ,那么 GUI 顯示正常,但應用程序永遠不會登錄到控制台(例如使用Console.WriteLine("some-text")時)。 這意味着我需要使用<OutputType>Exe</OutputType>配置 csproj 以便能夠登錄控制台任何內容,問題是在 GUI 模式下運行時,連同 GUI 應用程序 window,另一個控制台 window 彈出我想隱藏它以僅顯示 GUI。

在 dotnet 全框架 4.XI 中,能夠創建 WPF 應用程序,這些應用程序在 1 個 exe 中執行此雙控制台/gui 模式。 一個可能的解決方案是,如果我可以讓控制台 window 在 GUI 模式下運行時隱藏,或者 Avalonia-UI/dotnet-core 有其他方法可以做到這一點。 有誰知道怎么做?

更新:以下是一些說明:該應用程序有 2 種模式:

  • GUI 模式:如果您只是雙擊“App.exe”(不帶 args 參數運行),那么應該會出現 GUI(並且只有 GUI,而不是 GUI 加上另一個控制台 window,因為它目前正在發生)。 這通常可以通過將 csproj 設置為<OutputType>WinExe</OutputType>來完成,但這會使Console.Write function 在以下Console Mode運行時不起作用。
  • 控制台模式:如果高級用戶嘗試使用控制台中的某些應用程序功能自動執行某些操作,則該應用程序的行為應該像控制台應用程序一樣,具有人們期望的所有功能,例如app.exe -h來顯示可用命令, app.exe -v顯示版本等。這意味着不能顯示一些手工制作的 GUI window 顯示 output 文本或在其他任何地方記錄到文件中。

它可以在 2 個單獨的可執行文件中完成,但是像我這樣的一些人在只是一個簡單的 app.exe 文件的應用程序中發現了一些美。 這種雙重行為有很多例子,比如VisualStudio 的devenv.exeNirsoft應用程序。

如果我說對了,您想在特殊參數和 WinForms 應用程序上啟動控制台。

首先你必須設置

<DisableWinExeOutputInference>true</DisableWinExeOutputInference>

在您的項目文件中。 查看文檔

嘗試將<OutputType>設置回Exe並將其添加到您的Program > 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 文件,fe.:

yourcode.csproj(您的業務邏輯)

  • yourapp-console.csproj(控制台應用程序:參考 yourcode.csproj)
  • yourapp-ui.csproj(WinForms 應用程序:參考 yourcode.csproj)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM