.翻译自:https://github.com/dotnet/designs/blob/master/accepted/2020/single-file/staging.md

NET Core 3.0 中单文件应用程序的设计。

介绍

在 .NET Core 3.0 中实现阶段 1(在暂存文档中所述)对单文件应用的支持。

构建系统接口

可以通过将以下属性添加到应用程序的项目文件来触发发布到单个文件:

<PropertyGroup>
<PublishSingleFile>true</PublishSingleFile>
</PropertyGroup>
  • 该属性同时应用于框架依赖和自包含的发布操作。PublishSingleFile
  • 该属性适用于特定于平台的生成,与给定的运行时标识符有关。生成的输出是指定平台的本机二进制文件。设置为 时,将保留未定义或设置为 是一个错误。PublishSingleFilePublishSingleFiletrueRuntimeIdentifierUseAppHostfalse
  • 设置该属性会导致托管应用、托管依赖项、特定于平台的本机依赖项、配置等(基本上在运行时未设置属性的情况下运行发布目录的内容)嵌入到本机 中。PublishSingleFiledotnet publishapphost

默认情况下,符号文件不会嵌入到单文件中,而是作为单独的文件保留在发布目录中。这包括 IL 文件和即用式编译器生成的本机/文件。设置以下属性会导致符号文件包含在单文件中。.pdb.ni.pdbapp.guid.map

<PropertyGroup>
<IncludeSymbolsInSingleFile>true</IncludeSymbolsInSingleFile>
</PropertyGroup>

通过设置以下元数据,可以显式排除某些文件嵌入到单文件中:

<ExcludeFromSingleFile>true</ExcludeFromSingleFile>

例如,要将某些文件放在发布目录中,但不将它们捆绑到单文件中:

<ItemGroup>
<Content Update="*.xml">
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
<ExcludeFromSingleFile>true</ExcludeFromSingleFile>
</Content>
</ItemGroup>

捆绑器

捆绑包人是一个工具,将托管应用及其依赖项嵌入到本机可执行文件中,如下所述。下面将介绍 .NET Core 3.x 中的捆绑布局。AppHost

捆绑布局(第 1.0 版)
AppHost
(Bundle-Marker)
嵌入式文件
app.dll
app.deps.json
app.runtimeconfig.json
dependency.dll
...
捆绑标题
(版本 #)1.0
#Number of Embedded Files
Bundle-ID
每个捆绑文件的捆绑清单
:(

此信息在 3.0 中不使用)Location (Offset, Size)Type :IL, ReadyToRun, other

主机

启动时,AppHost 会检查其是否具有嵌入文件。如果是这样,它

  • 内存映射整个捆绑包文件。
  • 检查内容是否已提取到提取位置(如下所述)
    • 如果提取位置中的所有文件都完好无损,则执行将继续重用提取的文件。
    • 如果没有,则提取缺少的组件
  • 如果提取不可用,主机将嵌入的文件提取到磁盘,如本文档中所述。
  • 调用运行时(通过其他主机组件)。

提取位置

对于单文件应用,提取目录为<base>/<app>/<bundle-id>

  • <base>

    • DOTNET_BUNDLE_EXTRACT_BASE_DIR环境变量(如果已设置)。
    • 如果没有,则默认为:
      • 窗户:%TEMP%\.net
      • Unix:
        • ${TMPDIR}/.net/${UID}如果已设置;如果已设置否则${TMPDIR}
        • /var/tmp/.net/${UID}如果存在,并且是可写;否则/var/tmp
        • /tmp/.net/${UID}如果存在,并且是可写;否则失败。/tmp
  • <app>是单 exe 二进制的名称

  • <bundle-id>是唯一的捆绑标识符。

API 影响

大多数应用开发对于应用是否以单文件形式发布是不可知的。但是,处理文件物理位置的应用部分需要了解单文件打包。

  • Assembly.Location:返回提取位置内的实际位置。
  • AppContext.BaseDirectory:返回提取目录,其中驻留的位置。app.dll

用户体验

总之,以下是创建 HelloWorld 单文件应用的总体体验

  • 创建新的 HelloWorld 应用:HelloWorld$ dotnet new console

框架依赖HelloWorld

  • 正常发布:dotnet publish

    • 发布目录包含主机、应用程序、配置文件 和 PDB 文件。HelloWorld.exeHelloWorld.dllHelloWorld.deps.jsonHelloWorld.runtimeconfig.jsonHelloWorld.pdb
  • 单文件发布:dotnet publish -r win10-x64 --self-contained=false /p:PublishSingleFile=true

    • 发布目录包含:HelloWorld.exe HelloWorld.pdb

    • HelloWorld.dll中嵌入 和 , 并嵌入 到 中。HelloWorld.deps.jsonHelloWorld.runtimeconfig.jsonHelloWorld.exe

  • 运行:HelloWorld.exe

    • 该应用程序完全从单一文件运行,无需中间提取即可归档。

独立世界

  • 正常发布:dotnet publish -r win10-x64

    • 发布目录包含 221 个文件,包括主机、应用程序、配置文件、PDB 文件和运行时。
  • 单文件发布:dotnet publish -r win10-x64 /p:PublishSingleFile=true

    • 发布目录包含:HelloWorld.exe HelloWorld.pdb
    • 其余 219 个文件嵌入在主机中。HelloWorld.exe
  • 运行:HelloWorld.exe

    • 首次运行时,219 个嵌入式文件将在启动时提取到磁盘。
    • 应用的后续运行将重用提取,而不会产生启动开销。

调试

在应用的调试和分析方面,预计没有差异。

.net core 3.x 发布单文件的更多相关文章

  1. .NET Core 3.0 发布单文件可执行程序

    Windows dotnet publish -r win10-x64 /p:PublishSingleFile=true maxOS dotnet publish -r osx-x64 /p:Pub ...

  2. VS2019(NET Core 3.0)发布单文件可执行程序

    NET Core 3.0 发布单文件可执行程序 两种方法. 一.右击vs编辑项目文件,增加PublishSingleFile节点配置,代码如下: <Project Sdk="Micro ...

  3. .NET Core 3.0 Preview 5 亮点之一:发布单文件可执行程序

    在阅读 Announcing .NET Core 3.0 Preview 5 时发现了 .NET Core 3.0 Preview 5 的一个新特性 —— Publishing Single EXEs ...

  4. .NET Core 新特性:发布单文件可执行程序

    一.前言 .NET Core 3.0中新增加了一个特性:Publishing Single EXEs,可以通过dotnet publish 命令将整个.net core应用发布为一个可执行文件. 二. ...

  5. VS2017开发.net core 时默认发布路径文件夹多个BPC

    新安装的VS2017,编译后进行发布,结果在bin文件夹下多了个BPC文件夹,很是费解,查了资料才知道是VS2017默认设置了环境变量.在此记录下,如果不需要默认路径可修改环境变量,具体操作如下: 我 ...

  6. VS2019 发布单文件

    在项目.csproj文件下添加 <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework&g ...

  7. DotnetCore 单文件发布

    NETCORE3.0开始,可以发布单文件,参考https://www.cnblogs.com/ZaraNet/p/11790645.html 发布后(config目录 是手工复制进去的)   运行时, ...

  8. ASP.NET Core应用针对静态文件请求的处理[1]: 以Web的形式发布静态文件

    虽然ASP.NET Core是一款"动态"的Web服务端框架,但是在很多情况下都需要处理针对静态文件的请求,最为常见的就是这对JavaScript脚本文件.CSS样式文件和图片文件 ...

  9. 译 .NET Core 3.0 发布

    原文:<Announcing .NET Core 3.0> 宣布.NET Core 3.0 发布 很高兴宣布.NET Core 3.0的发布.它包括许多改进,包括添加Windows窗体和W ...

  10. Web的形式发布静态文件

    Web的形式发布静态文件 虽然ASP.NET Core是一款"动态"的Web服务端框架,但是在很多情况下都需要处理针对静态文件的请求,最为常见的就是这对JavaScript脚本文件 ...

随机推荐

  1. 初识GO语言--基本数据类型

  2. 使用wxpython开发跨平台桌面应用,动态工具的创建处理

    在我们开发系统的时候,往往需要一个很容易理解功能的工具栏,工具栏是一个系统的快速入口,美观易用的工具栏是可以给系统程序增色不少的,本篇随笔介绍在使用wxpython开发跨平台桌面应用,工具栏的动态展现 ...

  3. token、cookie、session的区别

    token是验证用户身份的令牌,通常是用于接口的身份验证,一般获取之后放在请求头中 cookie和session的区别: cookie是服务器发送到客户端然后存储在客户端的,可以用来保持用户的登录信息 ...

  4. 【FAQ】Harmo【FAQ】HarmonyOS SDK 闭源开放能力 — 公共模块

    1.问题描述: 文档哪里能找到所有的权限查看该权限是用户级的还是系统级的. 解决方案: 您好,可以看一下下方链接是否可以解决问题: https://developer.huawei.com/consu ...

  5. Redis之过期删除侧率

    Redis 中 key 的过期删除策略 内存碎片如何产生 碎片率的意义 如何清理内存碎片 内存淘汰触发的最大内存 有哪些内存淘汰策略 内存淘汰算法 LRU LFU 1.定时删除 2.惰性删除 3.定期 ...

  6. .net core想到哪写道哪之hello world

    今天,我们来创建一个helo world,讲一讲.Net 6最新的顶级语句的问题. 在.Net 6中最大的变化应该就是多了个顶级语句. 这玩意是个啥呢,它让C#看起来像个脚本语言了,一个Hello W ...

  7. monitor磁盘空间不足警告

    虚拟机安装ceph时,执行ceph -s monitor主机遇到了 mon c101(monitor主机名) is low on available space 错误 这是我找到的解决办法 monit ...

  8. web移动端触屏事件

    1.移动端与pc端的区别 (1)移动端没有鼠标,自然也没有鼠标事件.所以onmousedown之类的事件监听在移动端时无效的. (2)移动端为了响应双击事件,onclick事件有300ms的延迟,接下 ...

  9. 一个大幅提高开发效率的工具库 WYBasisKit

    WYBasisKit (持续更新) WYBasisKit 是做什么的? WYBasisKit 不仅可以帮助开发者快速构建一个工程,还有基于常用网络框架和系统API而封装的各种实用方法.扩展,开发者只需 ...

  10. PM2部署DotNet应用程序

    pm2简介 PM2是一个Node.js的进程管理工具,可以帮助开发者简化Node.js应用的部署和运维.它提供了进程守护.负载均衡.日志管理等功能,可以监控应用程序的运行状态,并在发生意外情况时自动重 ...