【问题标题】:Is it possible to run a .NET Core console application silently (hide console window)?是否可以静默运行 .NET Core 控制台应用程序(隐藏控制台窗口)?
【发布时间】:2016-08-04 20:16:19
【问题描述】:

我正在尝试为自己自动执行一些任务,并且我编写了一些 .NET Core 1.0 控制台应用程序。其中之一是 BrowserRouter - 一个基于 URL 模式的简单应用程序,当我单击 HTTP(S) 链接时,它决定打开哪个浏览器/浏览器配置文件。

这工作正常,但总有控制台窗口出现并立即消失。

有没有办法静默运行 .NET Core 控制台应用程序(隐藏控制台窗口)?

我知道在完整的 .NET Framework 中可以将输出类型更改为 Windows 应用程序,但对于 .NET Core 来说(还没有?)。

【问题讨论】:

  • 使用windows服务怎么样?
  • @VahidNaderi .Net Core 是 X-Plat - 不确定 Windows 服务如何在 Linux/MAC 上运行。
  • @mThurston 不,另一个问题是 1. 与 .net 核心无关,2. 解决从 Windows 应用程序中打开控制台应用程序时的情况。因此,您可以从 Windows 应用程序中对其进行控制。

标签: c# .net-core


【解决方案1】:

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的脚本。

【讨论】:

  • 这里有更多关于 editbin.exe 的 SUBSYSTEM 选项的文档:docs.microsoft.com/en-us/cpp/build/reference/subsystem 我将 editbin.exe 和 link.exe 复制到了我的解决方案下的文件夹中。在 VS2017 中,我在项目的后期构建事件中使用了以下内容:"$(SolutionDir)Build\bin\editbin.exe" -SUBSYSTEM:WINDOWS "$(SolutionDir)Project1\bin\Debug\netcoreapp1.1\win10-x64\Project1.exe"我不知道其他人是否有这个,但我无法让许多宏工作(可能是因为我不得不调整csproj 将其构建为 exe)。
  • @martinullrich 3.0 解决方案效果很好,知道如何在隐藏它的 kestrel cmd 后停止这个应用程序。我想使用按钮或窗口中的图标关闭/停止应用程序。有什么提示吗?
【解决方案2】:

我真的很想按照 Martin 的想法去做,但我找不到 editbin.exe。好吧,我应该运行 Visual Studio 安装程序并安装 Microsoft Visual C++,但我的内存有限,所以我在 NuGet 上找到了另一种方法 NSubsys。

应用程序将在发布时以隐藏模式运行。

注意从 NuGet 复制 Npm install 命令,因为从包管理器中搜索解决方案似乎没有找到任何结果。

【讨论】:

  • 您能否提供有关您如何使用 NSubsys 使其工作的说明?安装 NuGet 包后,您还需要采取哪些其他步骤?谢谢。
  • 另外,我是否正确地说 NSubsys 不会在本地开发人员上触发?是否只有在程序发布后才会触发(作为独立包)?
【解决方案3】:

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

<OutputType>WinExe</OutputType>

【讨论】:

    【解决方案4】:

    在 .NET Core SDK 2.1(我有 2.1.500)中,此项目文件正在运行:

    <Project Sdk="Microsoft.NET.Sdk">
    
        <PropertyGroup>
            <OutputType>WinExe</OutputType>
            <TargetFramework>net47</TargetFramework>
        </PropertyGroup>
    
    </Project>
    

    【讨论】:

    • 但这不是 .Net Core 应用程序。
    • WinExe 是这里的相关部分;将 netcoreapp3.1 用于 .NETCore 3.1
    • @svick:那是什么?
    • @PeterMortensen &lt;TargetFramework&gt;net47&lt;/TargetFramework&gt; 表示它是一个 .Net Framework 4.7 应用程序。
    【解决方案5】:

    如果您像我一样想要部署一个 ASP.NET Core MVC 应用程序

    • 在内部网络上
    • 不想要 IISWebHostService
    • 不关心 Linux/Mac
    • 想要对用户隐藏 Kestrel 控制台

    那么你应该阅读微软的官方文档,了解如何host an ASP.NET Core application in a Windows Service

    【讨论】:

    • 如果您希望托管静态内容,这很有效 - 但是,如果您希望生成具有隔离内存空间的工作进程。现在的一个技巧是 Dllimport kernel32 并调用 FreeConsole(),或者正如其他人提到的那样,在你的 postbuild 事件中使用 editbin.exe
    • @SamirBanjanovic 调用 FreeConsole 不会隐藏(释放)控制台窗口,因为它属于运行时 (dotnet),而不是 netcore DLL。
    • @McGuireV10 如果您通过 dotnet 命令运行应用程序,这是正确的。如果您在发布freeconsole() 作品后以独立方式运行该应用程序
    • 公平点,我忘记了自包含发布选项会产生一个 exe(此时 SCD 对我来说太臃肿了)。
    【解决方案6】:

    这可能不是最好或最干净的解决方案,而是我以前使用过的一个技巧。如果您启动一个新的 Windows 窗体应用程序,然后从 Program.cs 文件中删除对该窗体的引用,它将在后台运行该应用程序,而任务栏或桌面上不会显示任何内容。但它确实出现在任务管理器中。

    我用这个技巧编写了一个应用程序来对朋友恶作剧。它将在后台运行并以随机间隔执行系统哔声。同样,可能不是最优雅的解决方案,而是一种方法。

    【讨论】:

    • 如果它是 Winform 应用程序,您只需执行 this.Hide() 并且不会显示表单。 OP 想要隐藏控制台。
    • 我认为 dotnet core 尚不支持 WinForms
    【解决方案7】:

    我尝试编辑 .xproj 文件,但它似乎被 Visual Studio/.NET 忽略了。

    我认为它目前不受支持,因为 .NET 是在考虑网站和控制台应用程序的情况下开发的。微软最近决定他们将恢复到良好的旧 MSBuild。 (Changes to Project.json)

    所以,我认为你最好的选择是等到那时。

    【讨论】:

      【解决方案8】:

      您正在寻找ProcessStartInfo 类。特别是 CreateNoWindow 属性。

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

      类名和属性会根据您使用的 .NET 版本略有不同。同样重要的是要注意,这需要在进程初始化之前填充和调用。这适用于以编程方式或从 PowerShell 脚本等调用相关程序时。

      【讨论】:

        猜你喜欢
        • 2016-03-30
        • 2011-04-20
        • 2011-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-25
        • 2016-02-16
        相关资源
        最近更新 更多