簡體   English   中英

是否可以靜默運行 .NET Core 控制台應用程序(隱藏控制台窗口)?

[英]Is it possible to run a .NET Core console application silently (hide console window)?

我正在嘗試為自己自動執行一些任務,並且我編寫了一些 .NET Core 1.0 控制台應用程序。 其中之一是 BrowserRouter - 一個簡單的應用程序,它基於 URL 模式,決定在我單擊 HTTP(S) 鏈接時打開哪個瀏覽器/瀏覽器配置文件。

這工作正常,但總有控制台 window 出現並立即消失。

有沒有辦法靜默運行 .NET Core 控制台應用程序(隱藏控制台窗口)?

我知道在完整的 .NET Framework 中,可以將 output 類型更改為Windows Application ,但這對於 .NET Core 不可用(還?)。

2018更新:在 .NET Core 3.0+ 中,您將能夠在 csproj 文件中設置<OutputType>WinExe</OutputType>

目前,這不是直接可用的,因為 Windows EXE 文件包含一個標志,表明它是 Windows 甚至在啟動應用程序之前評估的“控制台”或“GUI”應用程序。 但是,可以使用editbin.exe更改此標志(據我所知,它隨 Visual Studio 的 C++ 構建工具一起提供)。

在此基礎上,您可以創建一個自包含的 .NET Core 應用程序(從project.json刪除"type": "platform"並添加一個運行時部分),以便您的項目輸出包含一個實際的.exe文件並添加一個帖子- 構建調用editbin.exe /subsystem:windows yourapp.exe

我真的很想在 Martin 解決后這樣做,但我找不到 editbin.exe。 好吧,我應該運行 Visual Studio 安裝程序並安裝 Microsoft Visual C++,但我的內存有限,所以我在NuGet上找到了另一種 NSubsys 方法。

該應用程序將在發布時以隱藏模式運行。

請注意從 NuGet 復制 Npm install 命令,因為從包管理器中搜索解決方案似乎沒有找到任何結果。

在 .NET Core SDK 2.1(我有 2.1.500)中,這個項目文件正在運行:

<Project Sdk="Microsoft.NET.Sdk">

    <PropertyGroup>
        <OutputType>WinExe</OutputType>
        <TargetFramework>net47</TargetFramework>
    </PropertyGroup>

</Project>

使用 .NET Core 3.0+(包括 .NET 5),只需在 csproj 中執行此操作:

<OutputType>WinExe</OutputType>

如果您像我一樣想要部署ASP.NET Core MVC 應用程序

  • 在內部網絡上
  • 不想要IISWebHostService
  • 不在乎 Linux/Mac
  • 並希望對用戶隱藏 Kestrel 控制台

那么您應該閱讀 Microsoft 的官方文檔,了解如何在 Windows 服務中托管 ASP.NET Core 應用程序

這可能不是最好或最干凈的解決方案,而是我以前使用過的一個技巧。 如果您啟動一個新的 Windows 窗體應用程序,然后從 Program.cs 文件中刪除對該窗體的引用,它將在后台運行該應用程序,而任務欄或桌面上不會顯示任何內容。 不過它確實出現在任務管理器中。

我用這個技巧寫了一個應用程序來惡作劇朋友。 它將在后台運行並以隨機間隔發出系統蜂鳴聲。 同樣,可能不是最優雅的解決方案,而是一種方法。

我嘗試編輯.xproj文件,但它似乎被 Visual Studio/.NET 忽略了。

我認為目前不支持它,因為 .NET 是在考慮網站和控制台應用程序的情況下開發的。 微軟最近決定他們將恢復到舊的 MSBuild。 對 Project.json 的更改

所以,我認為你最好的選擇是等到那時。

您可以在運行時隱藏 .net 核心控制台應用程序,只要它開始使用 windows api 調用。 請參閱下面的示例代碼

using System;
using System.Runtime.InteropServices;
using System.Threading;

namespace HideConsoleApp
{
    class Program
    {
        [DllImport("Kernel32.dll")]
        private static extern IntPtr GetConsoleWindow();
        [DllImport("User32.dll")]
        private static extern bool ShowWindow(IntPtr hWnd, int cmdShow);
        static void Main(string[] args)
        {
            Console.WriteLine("press any key to hide console window");
            Console.ReadKey();
            VsConsoleWindow(0);
            Console.ReadKey();
        }

        public static void VsConsoleWindow(int i)
        {
           
            IntPtr hWnd = GetConsoleWindow();
            if (hWnd != IntPtr.Zero)
            {
                // value of cv = 0 hide console window  
                // value of cv = 1 show console window
                ShowWindow(hWnd, i);
                Thread.Sleep(5000);
                ShowWindow(hWnd, 1);
            }
            return;
        }



    }
}

https://github.com/robinsondominic/hide.net-core-console-application

您正在尋找ProcessStartInfo類。 特別是 CreateNoWindow 屬性。

ProcessStartInfo processInfo = newProcessStartInfo("Name", "args");
processInfo.CreateNoWindow = true;

類名和屬性根據您使用的 .NET 版本略有不同。 同樣重要的是要注意,這需要在進程初始化之前填充和調用。 當以編程方式或從 PowerShell 腳本等調用相關程序時,此方法有效。

暫無
暫無

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

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