dotNET跨平台2025-08-28 08:02:32
什么单文件部署
通过将所有依赖应用程序的文件捆绑到一个二进制文件中,为应用程序开发人员提供一个具有吸引力的选项,那就是将应用程序作为单个文件进行部署和分发。 单文件部署可用于依赖框架的部署模型和独立应用程序。
独立应用程序中单个文件的大小很大,因为它包含运行时和框架库。 在 .NET 6 中,可以通过发布剪裁来减小与剪裁兼容的应用程序的总大小。 单文件部署选项可与 ReadyToRun 编译发布选项结合使用
为什么发布了不是单文件
当我们点击发布的时候勾选了生成单个文件选项后,发现发布后依然有其他DLL文件,理论上我们应该只有一个文件,但实际上发现并不是我们想象中的样式,其实在Net中有一个定义 本机库 这个概念
什么是本机库
本机库(Native Libraries)是指用原生代码(如C、C++等)编写的、针对特定操作系统和处理器架构编译的库文件。在.NET生态系统中,它们通常与托管代码(C#、VB.NET等)配合使用。
常用本机库扩展名
不同操作系统下的本机库文件扩展名:
Windows: .dll(动态链接库), .lib(静态库)
Linux: .so(共享对象), .a(静态库)
macOS: .dylib(动态库), .a(静态库)
NET中常见的本机库类型
运行时组件:
libcoreclr.so(Linux) / coreclr.dll(Windows) - .NET运行时核心组件
libhostfxr.so/ hostfxr.dll- 托管主机组件
平台互操作库:
System.Native.so/ System.Native.dll- 提供基本操作系统功能的封装
第三方原生依赖:
SQLite (SQLite.Interop.dll)
ImageMagick库
硬件加速库(如CUDA、OpenCL)
为什么需要独立本机库
因为本机库有以下几种特性:
是平台相关的(不同OS/架构需要不同版本)
不能像托管程序集那样直接嵌入到单文件应用中
通常需要在运行时提取到文件系统才能加载
如何将本机库也一并打包进行单个应用程序中?
在Net6.0+的单文件发布中,
IncludeNativeLibrariesForSelfExtract 就是用来控制这些本机库是否应该被包含在单文件包中并在运行时自动提取的,将它设置为true即可解决
PropertyGroup>PublishSingleFile>truePublishSingleFile>SelfContained>trueSelfContained>IncludeNativeLibrariesForSelfExtract>trueIncludeNativeLibrariesForSelfExtract>PropertyGroup>
注意
这个属性只在使用 PublishSingleFile>truePublishSingleFile>发布单文件应用程序时有效
启用后会增加最终单文件的大小,因为所有本机库都会被包含在内
在 .NET 6.0 之前,本机库默认是包含在单文件包中的,但在 .NET 6.0 中行为有所改变
