【译】.NET Core 3.0 发布自包含单体可执行程序
.NET Core 提供的发布应用程序选项 self-contained 是共享应用程序的好方法,因为应用程序的发布目录包含所有组件、运行时和框架。您只需要告诉使用者应用程序的入口 exe 文件,就可以使程序运行起来,而不必担心目标计算机上是否存在.NET Core 运行时和应用框架。目前 .NET Core 3.0 Preview 6 已经推出,也包含了更多新功能。其中一个有用的功能就是引入了 PublishTrimmed 发布标志。此标志可以很大程序上减少可执行文件的大小并会创建一个修剪过的自包含单体可执行文件。下面我们来看一下如何发布一个经过修剪的单体可执行文件。
.NET Core 3.0 中发布 self-contained 程序可以使用下面的命令:
dotnet publish -r win-x64 -c Release --self-contained
上面的命令执行之后会在创建的发布文件夹中包含 self-contained 可执行程序所需的所有文件,文件数大概有 100 个左右,如果想要在目标计算机上运行这个应用程序,那就需要复制这个发布文件夹内所有文件,似乎并不是那么方便,而且这些文件占用的空间也不算小。

这个问题在 .NET Core 3.0 Preview 5 中得到了解决。此版本引入了一个 PublishSingleFile 发布标志,用于生成一个单体 exe 可执行文件。该发布标志的使用方法如下:
dotnet publish -r win-x64 -c Release /p:PublishSingleFile=true
或者在项目文件中配置如下节点:
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.0</TargetFramework>
<RootNamespace>Hello_.NETCore3</RootNamespace>
<PublishSingleFile>true</PublishSingleFile>
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
</PropertyGroup>
使用此发布标志后只会生成一个 exe 可执行文件和符号文件。见下图

现在只有一个可执行文件了,但其文件大小有点儿小问题,一个可执行程序接近 70MB 。上面说过,在 .NET Core 3.0 Preview 6 中引入了 PublishTrimmed 发布标志,使用该发布选项将不会包含您未使用的类库,以达到减小发布单体文件的尺寸。您可以将上面的两个命令一起使用,如下:
dotnet publish -r win-x64 -c Release /p:PublishSingleFile=true /p:PublishTrimmed=true
或在项目文件中配置以上两个发布标志:
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.0</TargetFramework>
<RootNamespace>Hello_.NETCore3</RootNamespace>
<PublishSingleFile>true</PublishSingleFile>
<PublishTrimmed>true</PublishTrimmed>
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
</PropertyGroup>
使用上面的两个命令后,您会发现,单体可执行文件的尺寸只有 29MB 了。对于简单的控制台应用程序来说,它仍然有点儿大,但请注意,这是一个包含了 .NET Core 运行时的 self-contained 应用程序。

以上就是我要介绍的全部内容了。
原文链接:https://www.talkingdotnet.com/create-trimmed-self-contained-executable-in-net-core-3-0/
译者注:
参考链接:
- https://devblogs.microsoft.com/dotnet/announcing-net-core-3-0-preview-6/
- https://github.com/mono/linker/blob/master/src/ILLink.Tasks/README.md
【译】.NET Core 3.0 发布自包含单体可执行程序的更多相关文章
- 译 .NET Core 3.0 发布
原文:<Announcing .NET Core 3.0> 宣布.NET Core 3.0 发布 很高兴宣布.NET Core 3.0的发布.它包括许多改进,包括添加Windows窗体和W ...
- VS2019(NET Core 3.0)发布单文件可执行程序
NET Core 3.0 发布单文件可执行程序 两种方法. 一.右击vs编辑项目文件,增加PublishSingleFile节点配置,代码如下: <Project Sdk="Micro ...
- VS2017 IDE中发布自包含(SCD)DotNET Core项目
根据Stack Overflow上的一个回答得知,这项功能目前VS2017并不具备,但你可以通过如下方法发布自包含项目: 1.项目文件(.csproj)中添加RuntimeIdentifier配置项, ...
- .Net Core 2.0生态(4):Entity Framework Core 2.0 特性介绍和使用指南
前言 这是.Net Core 2.0生态生态介绍的最后一篇,EF一直是我喜欢的一个ORM框架,随着版本升级EF也发展到EF6.x,Entity Framework Core是一个支持跨平台的全新版本, ...
- 【EF】Entity Framework Core 2.0 特性介绍和使用指南
阅读目录 前言 获取和使用 新特性 项目升级和核心API变化 下一步计划 遗憾的地方 回到目录 前言 这是.Net Core 2.0生态生态介绍的最后一篇,EF一直是我喜欢的一个ORM框架,随着版本升 ...
- [译]Writing Custom Middleware in ASP.NET Core 1.0
原文: https://www.exceptionnotfound.net/writing-custom-middleware-in-asp-net-core-1-0/ Middleware是ASP. ...
- [译]ASP.NET Core 2.0 路由引擎
问题 ASP.NET Core 2.0的路由引擎是如何工作的? 答案 创建一个空项目,为Startup类添加MVC服务和请求中间件: public void ConfigureServices(ISe ...
- [译]ASP.NET Core 2.0 视图引擎
问题 如何在ASP.NET Core 2.0中使用Razor引擎来创建视图? 答案 新建一个空项目,修改Startup.cs,添加MVC服务和请求中间件: public void ConfigureS ...
- [译]ASP.NET Core 2.0 布局页面
问题 如何在ASP.NET Core 2.0项目中共享可见元素.代码块和指令? 答案 新建一个空项目,首先添加GreetingService服务和UserViewModel模型: public int ...
随机推荐
- ${FUNCNAME[@]}和$LINENO使用
$LINENO代表shell脚本的当前行号 [root@mysql-B ~]# cat test1.sh #!/bin/bash trap 'echo “before execute line:$LI ...
- java模拟post请求发送json数据
import com.alibaba.fastjson.JSONObject; import org.apache.http.client.methods.CloseableHttpResponse; ...
- git + gerrit push 代码问题
关于refs/for 和 refs/heads: 1. 这个不是git的规则,而是gerrit的规则, 2. Branches, remote-tracking branches, a ...
- Python:Pandas学习
import pandas as pd import numpy as np s = pd.Series([1, 3, 6, np.nan, 44, 1]) df= pd.DataFrame(np.r ...
- OAUTH2 SAML2.0
OAuth2 - http://www.cnblogs.com/linianhui/p/oauth2-authorization.html SAML - wikipedia Shibboleth / ...
- Java虚拟机性能监控与调优实战
From: https://c.m.163.com/news/a/D7B0C6Q40511PFUO.html?spss=newsapp&fromhistory=1 Java虚拟机性能监控与调 ...
- 用Golang让自己的电脑自动登录“上网管理”系统
用Golang让自己的电脑自动登录 1.缘起 大天朝的网络一般都是只对某些人开放的.上行下效,同样的措施也作用在我们的教育网上.我想不出来,为什么很多领导的总有这样的恶趣味(如果做的到,他们恨不得监控 ...
- 关于CEdit控件的透明(重绘)
摘自:http://www.jcwcn.com/html/VC/10_19_51_12.htm 做一个透明的Edit控件的主要问题是字符的输出,在Edit里输出的刷新有几个时机,一个是在接收到键盘或鼠 ...
- 通过内核对象在服务程序和桌面程序之间通信的小问题 good
关于在通过 事件对象 在服务程序和普通桌面应用程序相互之间通信的问题,分类情况进行讨论:1.普通桌面应用程序中创建事件,服务程序中打开事件 XP的情况普通桌面应用程序中创建: m_hEvent = : ...
- Qt设置窗体的透明度: setWindowOpacity
在Qt中,设置窗体透明度的函数有:void setWindowOpacity(qreal level) 特性: 透明度的有效范围从1.0(完全不透明)到0.0(完全透明的). 默认情况下,此属 ...