由于.net程序没有静态链接,一直缺乏单文件部署这种干净的发布方案。对客户端程序发布并不是很友好。在之前的.net framework下,有ILMerge合并程序集,以及LibZ的嵌入资源文件等第三方的解决方案。在.net core 3中,官方提供了一个单文件部署方案,不过这种方式是生成一个自解压程序,运行时将程序集解压到临时目录中,然后再运行程序。严格意义上是一个伪单文件方案,有的地方也有一些坑。

在.Net 5中,对单文件部署进行了进一步增强,可以直接运行代码,而无需从应用中提取文件。本文在这里进行一些简单的介绍。

传统的发布方式

首先看下传统的发布方式:dotnet publish

这种方式下,生成的文件比较小,需要安装runtime才能运行。生成的文件除了exe外,还有一个dll和两个json文件。

除了这种方式外,也有一种不依赖runtime的独立部署的方式,指定目标运行时即可:dotnet publish -r win-x64。

这种方式会携带几十个程序集,看着非常不舒服。

.Net 5的单文件部署

.Net 5下单文件发布的参数是/p:PublishSingleFile=true,它可以和其它几个参数组合,有如下几种单文件发布的方案。

  1. 依赖于Framework

dotnet publish -r win-x64 --self-contained=false /p:PublishSingleFile=true

这种方式和传统的发布方式非常类似,不过更加简单,没有json文件和dll文件。虽然也需要runtime,但在安装了runtime的情况下,是可以只有一个exe就可以运行的。

  2. 不依赖Framework

dotnet publish -r win-x64 /p:PublishSingleFile=true

和前面的方式相比,少了--self-contained=false参数,它生产的文件是包含运行程序集的,所以比较大。但可以不需要安装runtime即可运行。对于程序过大这一点,微软也提供了一个/p:PublishTrimmed=true 参数裁剪掉没有用到的程序集。

裁剪完了后只有10mb了,看着就好多了。此时会提示裁剪可能会改变程序行为,需要经过详细测试。

  3. 包含Native dll的单文件发布

前面的方式中,还是包含着四个系统相关的dll的(coreclr.dll, clrjit.dll, clrcompression.dll, mscordaccore.dll),这几个dll是系统原生的native dll(在不同的系统上不一样)。.net core程序运行的时候是依赖着这几个native dll的,他们无法和.net 程序集合并。

对于这个问题,微软提供了一个将这几个dll也给打包的参数:/p:IncludeNativeLibrariesForSelfExtract=true 使得可以生成更加干净的单文件模式。不过,这个方案是一个自解压的程序。虽然.net程序集已经合并了,但是和native的程序是以嵌入的方式混合在一起的,使用的时候,依然是先释放这几个native dll才运行的。

在GUI中配置单文件发布

在新版的visual studio中(目前是 16.8),已经有对单文件的发布的gui支持了,用起来也是非常方便的。

  

注意事项

单文件发布时,也是有一些需要注意的事项的,例如:如何指定某些程序集不合并发布,单文件发布后一些和路径相关的api的发生的变化等。这里就不一一列举了,感兴趣朋友可以参考下围绕的官方文档单文件部署和可执行文件

参考文章

.Net 5下的单文件部署的更多相关文章

  1. 《DotNet Web应用单文件部署系列》一、pubxml文件配置

    很多人想用DotNet开发软件赚点外快子补添家用,但心里总放不下心来,担心被人破解了.好消息是去年发布的DotNet 5支持单文件部署,不同于DotNet 3运行时将文件释放到临时文件夹内,DotNe ...

  2. 一起看期待已久的.NET Core 3.0新的单文件部署特性,记在昨日VS2019更新后

    VS2019又又又迎来一次新的更新,这次的重点在.NET Core, 妥妥的更新好,默默地反选2.2,一切都在意料之中. 这次我们来看VS2019的新特性单文件部署: https://www.talk ...

  3. 《DotNet Web应用单文件部署系列》二、打包wwwroot文件夹

    在这篇文章中,你将学到web缓存规则,文件传输中用到的压缩格式,以及如何手写代码响应请求.最后还能学到快速打包wwwroot文件夹组件用法. 一.了解Response Header 当第一次加载程序时 ...

  4. 《DotNet Web应用单文件部署系列》三、混淆dll文件

    众所周知,C#编译后的dll文件可被反编译,网上搜索"C# 反编译"会出现一大堆资料.为了提高反编译成本,我们必须对dll文件进行混淆处理. 目前,C#混淆工具很多,我推荐obfu ...

  5. 一丢丢学习之webpack4 + Vue单文件组件的应用

    之前刚学了一些Vue的皮毛于是写了一个本地播放器https://github.com/liwenchi123000/Local-Music-Player,如果觉得ok的朋友可以给个star. 就是很简 ...

  6. Vue之单文件组件的数据传递,axios请求数据及路由router

    1.传递数据 例如,我们希望把父组件的数据传递给子组件. 可以通过props属性来进行传递. 传递数据三个步骤: 步骤1:在父组件中,调用子组件的组名处,使用属性值的方式往下传递数据 <Menu ...

  7. fis入门-单文件编译之文件优化(optimize)

    FIS(Front-end Integrated Solution ),是百度的前端集成解决方案.最近几天在研究前端构建的东西,就顺便了解了下,果断各种高大上,可以到FIS官网围观感受一下.如果对fi ...

  8. Ubuntu下用devstack单节点部署Openstack

    一.实验环境 本实验是在Vmware Workstation下创建的单台Ubuntu服务器版系统中,利用devstack部署的Openstack Pike版. 宿主机:win10 1803  8G内存 ...

  9. Windows操作系统单文件夹下到底能存放多少文件及单文件的最大容量

    本文是转自:http://hi.baidu.com/aqgjoypubihoqxr/item/c896921f8c2eaba5feded5f2         最近需要了解Windows中单个文件夹下 ...

随机推荐

  1. java基础之反射类型Type

    Java在加入泛型之后,仅仅Class已经不足以描述数据的类型了,比如List<String>类型的数据,其Class的类型为List.class,但是其类型包含了泛型参数,所以java引 ...

  2. HZ游记

    HZ 游记 Day -1 收拾东西,准备出发. 话说这几天一直比较懒,也没什么心情和效率学习,颓废好几天了,希望到衡水以后能感觉好点. 不知道衡水有没有妹子 非常想看看衡水的样子,但是又害怕封闭式教学 ...

  3. adb 常用命令大全(7)- 其他实用功能

    屏幕截图 adb exec-out screencap -p > sc.pn 截图保存到电脑执行该命令的目录下 如果指定文件名以 .png 结尾时可以省略 -p 参数 注意 如果 adb 版本较 ...

  4. 命令行解析函数:getopt_long、getopt

    一.前言 在学习一些项目代码时,尤其涉及到命令行传参的代码,经常遇到getopt相关的函数,对这一类函数可以说是既陌生又熟悉.陌生是因为不知道它是干啥的,熟悉呢,是因为经常遇到.于是乎在追踪了多天ip ...

  5. GridView控件使用

    增加显示列gridView.Columns.AddVisible("AgentName", "姓名");设置是否为只读gridView1.OptionsBeha ...

  6. AWVS13批量添加目标脚本

    # -*-coding:utf-8-*- # @Author:malphite.tang import json import requests from queue import Queue req ...

  7. 分布式必备理论基础:CAP和BASE

    大家好,我是老三,今天是没有刷题的一天,心情愉悦,给大家分享两个简单的知识点:分布式理论中的CAP和BASE. CAP理论 什么是CAP CAP原则又称CAP定理,指的是在一个分布式系统中,Consi ...

  8. Docker容器基本命令注意点

    Docker 容器基本命令注意点 前言: a. 本文主要为 Docker的视频教程 笔记. b. 本机环境为 Windows 10 专业版,使用的命令行为 PowerShell. 1. docker ...

  9. redis连接密码和指定数据库

    台服务器上都快开启200个redis实例了,看着就崩溃了.这么做无非就是想让不同类型的数据属于不同的应用程序而彼此分开. 那么,redis有没有什么方法使不同的应用程序数据彼此分开同时又存储在相同的实 ...

  10. Windows Server 2008 系统加固

    账号安全:更改管理员账号 更改管理员账户名来避免攻击,提高系统安全性. 以Administrator账户登录本地计算机,开始->运行->compmgmt.msc(计算机管理)->本地 ...