由于.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. Python常见问题 - python3 requests库提示警告InsecureRequestWarning的问题

    当使用 requests 库发送请求时报了以下警告 D:\python3.6\lib\site-packages\urllib3\connectionpool.py:847: InsecureRequ ...

  2. Spring系列之集成MongoDB的2种方法

    MongoDB是最流行的NoSQL数据库,SpringBoot是使用Spring的最佳实践.今天带大家讲一讲SpringBoot集成MongoDB的两种方式,MongoDB的安装自行去官网查询,本地开 ...

  3. freeswitch刷新网关方法

    1.freeswitch xml配置文件新增网关后,使其生效,可以重启freeswitch或者使用命令方式 fs_cli -H 127.0.0.1 -P 8021 -p hmzj -x sofia p ...

  4. 干货!基于SpringBoot的RabbitMQ多种模式队列实战

    目录 环境准备 安装RabbitMQ 依赖 连接配置 五种队列模式实现 1 点对点的队列 2 工作队列模式Work Queue 3 路由模式Routing 4 发布/订阅模式Publish/Subsc ...

  5. django url配置-反向解析-视图函数-HttpRequest对象-HttpResponse对象-cookies-session-redis缓存session

    """ --视图概述:-- 作用:视图接受WEB请求,并响应WEB请求 本质:视图就是一个python中的函数 响应: 1.网页: 一.重定向 二.错误视图 400,50 ...

  6. solidity 错误

    solidity版本 0.7.5 Member "transfer" not found or not visible after argument-dependent looku ...

  7. SpringSecurity系列学习(一):初识SpringSecurity

    SpringSecurity Spring Security是spring采用AOP思想,基于servlet过滤器实现的安全框架.它提供了完善的认证机制和方法级的 授权功能.是一款非常优秀的权限管理框 ...

  8. Python3入门系列之-----字典

    字典 字典是一种可变容器模型,且存放任何类型对像(如:字符串,数字,或者列表甚至字典),每个字典有键名(key)和键值(value)且用冒号 :  隔开, 多个字典用逗号(,)隔开整个字典包括在花括号 ...

  9. WPF进阶技巧和实战01-小技巧

    Svg在WPF中的使用 方法1:拷贝svg中的部分代码转换成Geometry(作为Path的Data使用) 在vs或者直接打开svg,看到如下代码: <?xml version="1. ...

  10. Redis之品鉴之旅(三)

    3)Set,可以去重的.无序的集合.可以取交集.并集.zset(sorted set),有序的.去重的集合,排序不是根据value排序,而是根据score排序. using (RedisClient ...