[英]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.