原文:dotnet core 通过修改文件头的方式隐藏控制台窗口

在带界面的 dotnet core 程序运行的时候就会出现一个控制台窗口,本文告诉大家使用最简单方法去隐藏控制台窗口。

最近在使用 Avalonia 开发,这是一个支持 dotnet framework 和 dotnet core 的框架,在开发的过程发现启动的窗口居然会出现控制台窗口。

在 VisualStudio 2017 的格式,如果是 dotnet framework 的程序,在没有设置 OutputTypeWinExe 的是时候,启动程序会显示一个控制台窗口。

虽然在 dotnet framework 程序可以简单通过设置OutputTypeWinExe 解决。如果这时使用跨平台多项目,就会看到 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博客

PE文件结构详解 - CSDN博客

Windows下Console和Win32程序差异-HelloWorld-51CTO博客

深入理解 Win32 PE 文件格式 - 国立秀才 - 博客园

更多阅读

你应该知道的程序集版本 - WeihanLi - 博客园


本文会经常更新,请阅读原文:
https://lindexi.gitee.io/lindexi/post/dotnet-core-%E9%80%9A%E8%BF%87%E4%BF%AE%E6%94%B9%E6%96%87%E4%BB%B6%E5%A4%B4%E7%9A%84%E6%96%B9%E5%BC%8F%E9%9A%90%E8%97%8F%E6%8E%A7%E5%88%B6%E5%8F%B0%E7%AA%97%E5%8F%A3.html
,以避免陈旧错误知识的误导,同时有更好的阅读体验。


本作品采用
知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议
进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:
https://lindexi.gitee.io
),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请
与我联系

dotnet core 通过修改文件头的方式隐藏控制台窗口的更多相关文章

  1. 2018-9-30-dotnet-core-通过修改文件头的方式隐藏控制台窗口

    title author date CreateTime categories dotnet core 通过修改文件头的方式隐藏控制台窗口 lindexi 2018-09-30 18:36:43 +0 ...

  2. .net core各种修改环境变量的方式

    除了修改系统变量,或者程序硬编码中修改,还有以下方法: 发布在IIS中,修改web.config <environmentVariables> <environmentVariabl ...

  3. dotnet core 隐藏控制台

    如果写一个控制台程序,需要隐藏这个控制台程序,可以使用本文的方法 如果是在 Windows 下运行, 可以使用一些系统提供的方法隐藏控制台.如果是 Linux 下,都是控制台,就不用隐藏了 复制下面的 ...

  4. asp dotnet core 通过图片统计 csdn 用户访问

    在 csdn 的访问统计里面,只能用 csdn 提供的访问统计,因为在 csdn 中不支持在博客加上 js 代码,也就是无法使用友盟等工具统计. 通过在 asp dotnet core 创建一个图片链 ...

  5. 使用dd备份和恢复ASM中的数据文件头

    这里用大家随处可见的(除了extent分布的x$kffxp需要百度和google外),其余都是文档中有详细记载的常用ASM视图来实现同样功能: 下面的用于从ASM中备份数据文件头: SQL> s ...

  6. dotnet core 在 MIPS 下的移值进度

    本文仍处于修订中 写在开始前 我们的主要业务基于 dotnet core 2.x 与 3.1 完成,目前 dotnet core 3.1 支持的 CPU 架构列表中还不包含龙芯,且在 gitlab i ...

  7. 一文说通Dotnet Core的后台任务

    这是一文说通系列的第二篇,里面有些内容会用到第一篇中间件的部分概念.如果需要,可以参看第一篇:一文说通Dotnet Core的中间件   一.前言 后台任务在一些特殊的应用场合,有相当的需求. 比方, ...

  8. dotnet core部署方式两则:CLI、IIS

    最近在使用dotnet core研究整个开发过程,使用下面两种方式部署: 一,使用 dotnet run 命令运行 在项目路径,shift+右键,选择 “在此处打开命令窗口”,在CMD窗口中运行“do ...

  9. Docker 简单发布dotnet core项目 文本版

    原文:https://www.cnblogs.com/chuankang/p/9474591.html docker发布dotnet core简单流程 照着步骤来基本没错 但是有几个要注意的地方: v ...

随机推荐

  1. NPF

    NPF是一个协议驱动.从性能方面来看,这不是最好的选择,但是它合理地独立于MAC层并且有权使用原始通信 (raw traffic).NPF是Winpcap的核心部分,它是Winpcap完成困难工作的组 ...

  2. vue2.0 踩坑记录之组件

    - did you register the component correctly? For recursive components, make sure to provide the " ...

  3. iOS开发UI篇--一个侧滑菜单SlidingMenu

    一.简介 侧滑菜单已经成为app一个极常用的设计,不管是事务类,效率类还是生活类app.侧滑菜单因Path 2.0和Facebook为开发者熟知,国内目前也有很多流行app用到了侧滑菜单,比如QQ.网 ...

  4. zynq mac地址修改

    工作中遇到多个zynq板子同时位于一个交换机网络中,由于默认mac地址相同,无法进行通信,因此需要对每个板子修改mac地址. 方案:使用uboot配置文件 步骤: 在uboot配置文件中添加及修改下面 ...

  5. [NodeJS] Use Now alias for custom sub-domains

    Now is a great way to deploy your node application, but the generated URLs aren't memorable or easil ...

  6. 如何把canvas元素作为网站背景总结详解

    如何把canvas元素作为网站背景总结详解 一.总结 一句话总结:最简单的做法是绝对定位并且z-index属性设置为负数. 1.如何把canvas元素作为网站背景的两种方法? a.设置层级(本例代码就 ...

  7. thinkphp 3.2,引入第三方类库的粗略记录

    首先用第三方类库我是放到vendor里面的 根目录\ThinkPHP\Library\Vendor\Wxphp 例如创建了一个Wxphp文件夹,里面有个php文件叫做     zll.php    文 ...

  8. ios开发网络学习四:NSURLConnection大文件断点下载

    #import "ViewController.h" @interface ViewController ()<NSURLConnectionDataDelegate> ...

  9. ios开发之核心动画四:核心动画-Core Animation--CABasicAnimation基础核心动画

    #import "ViewController.h" @interface ViewController () @property (weak, nonatomic) IBOutl ...

  10. [转载]剥析surging的架构思想

    1.前言 2.通信机制 2.1 简介      在单体应用中,模块之间的调用通信通过引用加载方法或者函数来实现,但是单体应用最终都会因为团队壮大,项目模块的扩展和部署等出现难以维护的问题.随着业务需求 ...