2018-9-30-dotnet-core-通过修改文件头的方式隐藏控制台窗口
title | author | date | CreateTime | categories |
---|---|---|---|---|
dotnet core 通过修改文件头的方式隐藏控制台窗口 |
lindexi |
2018-09-30 18:36:43 +0800 |
2018-07-24 19:57:37 +0800 |
Avalonia Roslyn dotnetcore |
在带界面的 dotnet core 程序运行的时候就会出现一个控制台窗口,本文告诉大家使用最简单方法去隐藏控制台窗口。
最近在使用 Avalonia 开发,这是一个支持 dotnet framework 和 dotnet core 的框架,在开发的过程发现启动的窗口居然会出现控制台窗口。
在 VisualStudio 2017 的格式,如果是 dotnet framework 的程序,在没有设置 OutputType
为 WinExe
的是时候,启动程序会显示一个控制台窗口。
虽然在 dotnet framework 程序可以简单通过设置OutputType
为 WinExe
解决。如果这时使用跨平台多项目,就会看到 dotnet core 项目依旧会显示黑色窗口
最简单的方法是通过修改 PE 文件的方式,在 NSubsys就是编写了一个 Task 用来在编译完成获取 Exe 修改 PE 文件格式,隐藏黑色窗口
安装 NSubsys 的方法就是从 Nuget 搜索 NSubsys 然后使用 dotnet publish
一下就可以了
如果想知道为什么你安装了一个 Nuget 就可以帮你修改请看如何创建一个基于 MSBuild Task 的跨平台的 NuGet 工具包 - walterlv
虽然知道了使用这个方法可以隐藏控制台,但是这里还是需要告诉大家一些原理。
在使用 C# 编译器,可以通过 csc 加上一个开关 /t:
告诉 csc 当前编译出来的是 控制台界面还是图形界面。通过下面不同的代码可以创建不同的软件
/t:exe 创建控制台软件
/t:winexe 创建图形界面软件
创建的软件的文件如 exe 或 dll 都是 PE 文件,在 PE 文件有一个 Subsystem 的字段表示了这个 PE 文件是控制台软件还是图形界面。在 PE 文件通过 Subsystem
可以告诉系统,现在打开的软件是控制台软件还是图形界面软件,这个值有很多个表示,其中可以使用IMAGE_SUBSYSTEM_WINDOWS_GUI
表示这是一个 GUI 软件,通过IMAGE_SUBSYSTEM_WINDOWS_CUI
可以表示这是一个控制台软件。
所以只需要通过修改 PE 文件的方式去告诉系统,这个软件是图形软件,就不会显示控制台。
更多关于 PE 文件请看 windows PE文件结构及其加载机制 - CSDN博客
Windows下Console和Win32程序差异-HelloWorld-51CTO博客
深入理解 Win32 PE 文件格式 - 国立秀才 - 博客园
更多阅读
博客园博客只做备份,博客发布就不再更新,如果想看最新博客,请访问 https://blog.lindexi.com/
如图片看不见,请在浏览器开启不安全http内容兼容
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名[林德熙](https://www.cnblogs.com/lindexi)(包含链接:https://www.cnblogs.com/lindexi ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我[联系](mailto:lindexi_gd@163.com)。