.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中单个文件夹下 ...
随机推荐
- shp平滑处理
在做图像数据处理时,经常会有栅格数据转矢量数据的操作,转换后的矢量文件会存在锯齿状边缘,不太美观,因此常常需要对矢量(shp)文件做平滑处理. 1 利用arcgis实现shp的平滑和简化 ArcToo ...
- 20210501 序列,熟练剖分(tree),建造游乐园(play)
考场 \(65+5+0\),并列 rk2 最高分 \(55+10+10\) T1:等比数列可以写作 \(q^kx\),发现 \(q\le1000\) 且有一档分为 \(a_i\le100\),想到 \ ...
- B. 2194: 快速傅立叶之二解题报告
$$\begin{eqnarray}&c[k] = \sum_{i}^{n}a[i]b[i-k] \\&c[k] = \sum_{i}^{n}a[n-i]b[i-k] (倒序保存a) ...
- vscode安装go插件失败
解决办法:使用golang代理,在环境变量中添加两个新变量: 详情参考vscode中为golang开发环境配置代理goproxy 之后便有一部分可以安装成功
- C# List集合类常用操作 (一)
所有操作基于以下类 class Employees { public int Id { get; set; } public string Name { get; set; } public stri ...
- 计算字符串的长度.len,RuneCountInString
内置函数len(),可以返回字符串/数组/切片/map/channel的长度. unicode/utf8包 函数:RuneCountInString(输入一个字符串),返回int类型的字符串长度.由于 ...
- leetcode-H2O生成(多线程)
现在有两种线程,氧 oxygen 和氢 hydrogen,你的目标是组织这两种线程来产生水分子. 存在一个屏障(barrier)使得每个线程必须等候直到一个完整水分子能够被产生出来. 氢和氧线程会被分 ...
- 一文看懂String类中的常用方法
1.int length(): 返回字符串的长度: return value.length 2.char charAt(int index): 返回某索引处的字符return value[index] ...
- 274 day04_Map,斗地主案例
day04 [Map] 主要内容 Map集合 教学目标 [ ] 能够说出Map集合特点 [ ] 使用Map集合添加方法保存数据 [ ] 使用"键找值"的方式遍历Map集合 [ ...
- symfony2已有数据表导入实体时报错 Doctrine does not support reverse engineering from tables that don't have a primary key
先在配置文件 app/config/config.yml中配置 schema_filter: /^(?!(tablename))/ 即可,或者在出现问题表都加上一个id 然后再使用命令 php app ...