.Net 5下的单文件部署
由于.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,它可以和其它几个参数组合,有如下几种单文件发布的方案。
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了,看着就好多了。此时会提示裁剪可能会改变程序行为,需要经过详细测试。
前面的方式中,还是包含着四个系统相关的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下的单文件部署的更多相关文章
- 《DotNet Web应用单文件部署系列》一、pubxml文件配置
很多人想用DotNet开发软件赚点外快子补添家用,但心里总放不下心来,担心被人破解了.好消息是去年发布的DotNet 5支持单文件部署,不同于DotNet 3运行时将文件释放到临时文件夹内,DotNe ...
- 一起看期待已久的.NET Core 3.0新的单文件部署特性,记在昨日VS2019更新后
VS2019又又又迎来一次新的更新,这次的重点在.NET Core, 妥妥的更新好,默默地反选2.2,一切都在意料之中. 这次我们来看VS2019的新特性单文件部署: https://www.talk ...
- 《DotNet Web应用单文件部署系列》二、打包wwwroot文件夹
在这篇文章中,你将学到web缓存规则,文件传输中用到的压缩格式,以及如何手写代码响应请求.最后还能学到快速打包wwwroot文件夹组件用法. 一.了解Response Header 当第一次加载程序时 ...
- 《DotNet Web应用单文件部署系列》三、混淆dll文件
众所周知,C#编译后的dll文件可被反编译,网上搜索"C# 反编译"会出现一大堆资料.为了提高反编译成本,我们必须对dll文件进行混淆处理. 目前,C#混淆工具很多,我推荐obfu ...
- 一丢丢学习之webpack4 + Vue单文件组件的应用
之前刚学了一些Vue的皮毛于是写了一个本地播放器https://github.com/liwenchi123000/Local-Music-Player,如果觉得ok的朋友可以给个star. 就是很简 ...
- Vue之单文件组件的数据传递,axios请求数据及路由router
1.传递数据 例如,我们希望把父组件的数据传递给子组件. 可以通过props属性来进行传递. 传递数据三个步骤: 步骤1:在父组件中,调用子组件的组名处,使用属性值的方式往下传递数据 <Menu ...
- fis入门-单文件编译之文件优化(optimize)
FIS(Front-end Integrated Solution ),是百度的前端集成解决方案.最近几天在研究前端构建的东西,就顺便了解了下,果断各种高大上,可以到FIS官网围观感受一下.如果对fi ...
- Ubuntu下用devstack单节点部署Openstack
一.实验环境 本实验是在Vmware Workstation下创建的单台Ubuntu服务器版系统中,利用devstack部署的Openstack Pike版. 宿主机:win10 1803 8G内存 ...
- Windows操作系统单文件夹下到底能存放多少文件及单文件的最大容量
本文是转自:http://hi.baidu.com/aqgjoypubihoqxr/item/c896921f8c2eaba5feded5f2 最近需要了解Windows中单个文件夹下 ...
随机推荐
- 转:C#读取PDF、TXT内容
//读取PDF内容 private void button2_Click(object sender, EventArgs e) { label3.Text = OnCreated("D:\ ...
- Identity用户管理入门七(扩展用户字段)
在实际使用时会发现很多字段在IdentityUser中并不存在,比如增加生日,地址等字段,可在模型类中实现自己的模型并继承自IdentityUser,需要修改的代码为以下类 一.新增模型 using ...
- ysoserial CommonsColletions4分析
ysoserial CommonsColletions4分析 其实CC4就是 CC3前半部分和CC2后半部分 拼接组成的,没有什么新的知识点. 不过要注意的是,CC4和CC2一样需要在commons- ...
- 使用zipKin构建NetCore分布式链路跟踪
本文主要讲解使用ZipKin构建NetCore分布式链路跟踪 场景 因为最近公司业务量增加,而项目也需要增大部署数量,K8S中Pod基本都扩容了一倍,新增了若干物理机,部分物理机网络通信存在问题,导致 ...
- .NET 6 中的HTTP 3支持
dotnet团队官方博客发布了一篇HTTP3的文章:HTTP/3 support in .NET 6:https://devblogs.microsoft.com/dotnet/http-3-supp ...
- 【tp6】解决Driver [Think] not supported.
使用助手函数view时会出现 解决方法:使用composer安装composer require topthink/think-view
- 第三方api接口
做为一个软件测试工程师,你要学习接口测试,需要练习,那么就要有调用的api,可以参考以下的文章. 国内7款API供应平台功能对比及详细介绍 https://blog.csdn.net/ishxiao/ ...
- requestAnimationFrame 切换页面问题
requestAnimationFrame 切换页面时, 之前定时的内容还会继续执行. 所以 要注意处理动画函数内容,否则会出现死循环. 遇到的问题: 我在两个页面都有使用 requestAnimat ...
- django如何加载外部文件
django如何加载外部文件(环境:pycharm python2.7 django1.11) 有一份新的文件夹名为:py_aiplat_demo,内含有多个文件夹(SDK,demo,data). 1 ...
- 使用亚马逊服务器报错:Signature not yet current: 20190726T070253Z is still later than 20190726T070246Z (20190726T065746Z + 15 min.)时间不同步的解决办法
1.首先获取亚马逊的时间: $ curl http://s3.amazonaws.com -v 2.更改当前服务器时间,使之与亚马逊时间同步 $ date -s 'xxxx-xx-xx xx:xx:x ...