繁体   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