.翻译自: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>
PublishSingleFilePublishSingleFilePublishSingleFiletrueRuntimeIdentifierUseAppHostfalsePublishSingleFiledotnet 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.dllapp.deps.jsonapp.runtimeconfig.jsondependency.dll... |
| 捆绑标题 (版本 #) 1.0#Number of Embedded FilesBundle-ID |
| 每个捆绑文件的捆绑清单 :( 此信息在 3.0 中不使用) Location (Offset, Size)Type :IL, ReadyToRun, other |
启动时,AppHost 会检查其是否具有嵌入文件。如果是这样,它
对于单文件应用,提取目录为<base>/<app>/<bundle-id>
<base>是
DOTNET_BUNDLE_EXTRACT_BASE_DIR环境变量(如果已设置)。%TEMP%\.net${TMPDIR}/.net/${UID}如果已设置;如果已设置否则${TMPDIR}/var/tmp/.net/${UID}如果存在,并且是可写;否则/var/tmp/tmp/.net/${UID}如果存在,并且是可写;否则失败。/tmp<app>是单 exe 二进制的名称
<bundle-id>是唯一的捆绑标识符。
大多数应用开发对于应用是否以单文件形式发布是不可知的。但是,处理文件物理位置的应用部分需要了解单文件打包。
Assembly.Location:返回提取位置内的实际位置。AppContext.BaseDirectory:返回提取目录,其中驻留的位置。app.dll总之,以下是创建 HelloWorld 单文件应用的总体体验
HelloWorld$ dotnet new console正常发布:dotnet publish
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
单文件发布:dotnet publish -r win10-x64 /p:PublishSingleFile=true
HelloWorld.exe HelloWorld.pdbHelloWorld.exe运行:HelloWorld.exe
在应用的调试和分析方面,预计没有差异。
原文:https://www.cnblogs.com/wxb8/p/12566429.html