[英]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 應用程序
那么您應該閱讀 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.