Gtk# Windows应用在.NET 6下设置WinExe仍显示控制台窗口如何隐藏
解决方案
方法1:修正项目文件配置(推荐)
你遇到的是.NET 6+单文件发布时的已知问题:默认会忽略WinExe输出类型的PE头配置,需要在csproj的PropertyGroup节点里额外添加2项配置,修改后的配置如下:
<PropertyGroup> <OutputType>WinExe</OutputType> <TargetFramework>net6.0</TargetFramework> <RuntimeIdentifier>win-x64</RuntimeIdentifier> <!-- 新增以下两个配置 --> <DisableWinExeOutputInference>false</DisableWinExeOutputInference> <UseAppHost>true</UseAppHost> </PropertyGroup>
修改完成后重新执行发布命令即可,绝大多数场景下该方法可以直接解决问题。
方法2:发布时显式指定输出类型
如果修改项目文件未生效,可以在原有发布命令末尾追加参数-p:OutputType=WinExe,完整命令如下:
dotnet publish -c Release -o publish -p:PublishReadyToRun=true -p:PublishSingleFile=true -p:PublishTrimmed=true --self-contained true -p:IncludeNativeLibrariesForSelfExtract=true -p:EnableCompressionInSingleFile=true -p:OutputType=WinExe
方法3:代码层面强制隐藏控制台(兜底方案)
如果上述两个方法都没有生效,可以直接在程序入口调用Windows系统API强制隐藏控制台,修改后的Program.cs代码如下:
using System; using Gtk; using System.Runtime.InteropServices; namespace projects { class Program { // 引入Win32 API [DllImport("kernel32.dll")] static extern IntPtr GetConsoleWindow(); [DllImport("user32.dll")] static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); const int SW_HIDE = 0; [STAThread] public static void Main(string[] args) { // 启动后第一时间隐藏控制台 var consoleHandle = GetConsoleWindow(); ShowWindow(consoleHandle, SW_HIDE); Application.Init(); var app = new Application("org.projects.projects", GLib.ApplicationFlags.None); app.Register(GLib.Cancellable.Current); var win = new MainWindow(); app.AddWindow(win); win.Show(); Application.Run(); } } }
该方案为兜底方案,所有场景下都可以隐藏控制台,缺点是控制台会出现极短时间的闪烁后消失。
内容的提问来源于stack exchange,提问作者aldo
相关产品推荐
相关产品推荐

