.NET 应用程序发布概述
使用 .NET 创建的应用程序可以采用两种不同的模式发布,该模式会影响用户运行应用的方式。
将应用作为独立应用,生成的应用程序将包含 .NET 运行时和库,以及该应用程序及其依赖项。 应用程序的用户可以在未安装 .NET 运行时的计算机上运行它。
如果将应用发布为依赖于框架的应用,生成的应用程序将仅包含该应用程序本身及其依赖项。 应用程序的用户必须单独安装 .NET 运行时。
默认情况下,这两种发布模式都生成特定于平台的可执行文件。 无需可执行文件即可创建依赖于框架的应用程序,这些应用程序是跨平台的。
生成可执行文件时,可以使用运行时标识符(RID)指定目标平台。 有关 RID 的详细信息,请参阅 .NET RID 目录。
下表概述了用于将应用发布为依赖于框架的应用或独立应用的命令:
类型 | 命令 |
---|---|
适用于当前平台的依赖于框架的可执行文件。 | dotnet publish |
适用于特定平台的依赖于框架的可执行文件。 | dotnet publish -r <RID> |
依赖于框架的二进制文件。 | dotnet publish |
独立可执行文件。 | dotnet publish -r <RID> --self-contained |
有关详细信息,请参阅 .NET dotnet publish 命令。
生成可执行文件
可执行文件不是跨平台的,它们特定于操作系统和 CPU 体系结构。 发布应用并创建可执行文件时,可以将应用发布为独立应用或依赖于框架的应用。 将应用发布为自包含形式,将 .NET 运行时包含在应用中,这样应用的用户无需担心在运行应用之前安装 .NET。 将应用发布为依赖于框架的应用时,不包含 .NET 运行时;仅包含该应用和第三方依赖项。
以下命令生成可执行文件:
类型 | 命令 |
---|---|
适用于当前平台的依赖于框架的可执行文件。 | dotnet publish |
适用于特定平台的依赖于框架的可执行文件。 | dotnet publish -r <RID> |
独立可执行文件。 | dotnet publish -r <RID> --self-contained |
生成跨平台二进制文件
以 dll 文件的形式将应用发布为依赖于框架的应用时,将创建跨平台二进制文件。 dll 文件以您的项目命名。 例如,如果你有一个名为 word_reader的应用,则会创建一个名为 word_reader.dll 的文件。 以这种方式发布的应用使用 dotnet <filename.dll>
命令运行,可在任何平台上运行。
只要安装了目标 .NET 运行时,就可以在任何操作系统上运行跨平台二进制文件。 如果未安装目标 .NET 运行时,如果将应用配置为前滚,则它可以使用较新的运行时运行。 有关详细信息,请参阅依赖于框架的应用前滚。
可以选择通过 dotnet
命令将应用作为特定于平台的可执行文件或跨平台二进制文件运行。 通过平台特定的可执行文件启动普通服务器应用与使用 dotnet
命令启动时,应用程序的行为不应有任何差异。使用平台特定的可执行文件启动可以更好地与底层操作系统集成。 例如:
- 在进程列表中看到应用程序可执行文件名称,而不是
dotnet
,如果有多个,这可能会造成混淆。 - 可以利用特定于操作系统的功能自定义特定于平台的可执行文件。 例如,请参阅此讨论 有关在 Windows上配置默认堆栈大小的讨论。
以下命令生成跨平台二进制文件:
类型 | 命令 |
---|---|
依赖于框架的跨平台二进制文件。 | dotnet publish |
发布依赖于框架的应用
发布为依赖于框架的应用是跨平台的,不包括 .NET 运行时。 使用您的应用程序的用户需要安装 .NET 运行时。
如果将应用发布为依赖于框架的应用,会以 dll 文件的形式生成一个跨平台二进制文件,还会生成面向当前平台的特定于平台的可执行文件。 dll 是跨平台的,而可执行文件则不是。 例如,如果你发布一个名为 word_reader 、以 Windows 为目标的应用程序,那么会创建一个 word_reader.exe 可执行文件及 word_reader.dll。 面向 Linux 或 macOS 时,将创建 word_reader 可执行文件和 word_reader.dll。 如果应用使用具有特定于平台的实现的 NuGet 包,则所有平台的依赖项都将被复制到 publish\runtimes\{platform} 文件夹。
应用的跨平台二进制文件可以使用 dotnet <filename.dll>
命令运行,并且可以在任何平台上运行。
特定于平台和依赖于框架
可以通过将 -r <RID>
参数传递给 dotnet publish
命令来发布特定于平台的依赖框架的应用。 以这种方式发布与发布依赖于框架的应用相同,但特定于平台的依赖项的处理方式不同。 如果应用使用具有特定于平台的实现的 NuGet 包,则仅复制目标平台的依赖项。 这些依赖项将被直接复制到 publish 文件夹中。
虽然从技术上来说,生成的二进制文件是跨平台的,但通过面向特定平台,你的应用不能保证运行跨平台。 可以运行 dotnet <filename.dll>
,但应用在尝试访问平台特定的缺失依赖项时会崩溃。
有关 RID 的详细信息,请参阅 .NET RID 目录。
优势
小型部署
仅分发应用及其依赖项。 .NET 运行时和库由用户安装,所有应用共享运行时。跨平台
你的应用和任何 。基于 NET 的库在其他操作系统上运行。 无需为应用定义目标平台。 有关 .NET 文件格式的信息,请参阅 .NET 程序集文件格式。使用最新修补运行时
应用会使用目标系统上安装的最新运行时(在 .NET 的目标大小系列中)。 这意味着你的应用会自动使用 .NET 运行时的最新修补版本。 可以重写这一默认行为。 有关详细信息,请参阅依赖于框架的应用前滚。
缺点
要求预先安装运行时
只有当您应用程序所针对的 .NET 版本已经安装在主机系统上时,您的应用程序才能运行。 可以将应用的前滚行为配置为需要特定版本的 .NET 或允许较新版本的 .NET。 有关详细信息,请参阅依赖于框架的应用前滚。.NET 可能会更改
可以在运行应用的计算机上更新 .NET 运行时和库。 在极少数情况下,如果使用大多数应用的 .NET 库,这可能会更改应用的行为。 可以配置应用如何使用较新版本的 .NET。 有关详细信息,请参阅依赖于框架的应用前滚。
例子
将应用发布为跨平台和依赖于框架的应用。 与 dll 文件一起创建面向当前平台的可执行文件。 任何特定于平台的依赖项都随应用一起发布。
dotnet publish
将应用发布为特定于平台和依赖于框架的应用。 Linux 64 位可执行文件与 dll 文件一起创建。 只有目标平台的依赖项随应用一起发布。
dotnet publish -r linux-x64
发布独立应用
将应用发布为独立应用,将生成特定于平台的可执行文件。 输出发布文件夹包含应用的所有组件,包括 .NET 库和目标运行时。 该应用与其他 .NET 应用隔离,不使用本地安装的共享运行时。 你的应用程序用户无需下载和安装 .NET。
可以通过将 --self-contained
参数传递给 dotnet publish
命令来发布独立应用。 为指定的目标平台生成可执行二进制文件。 例如,如果你有一个名为 word_reader的应用,并且发布了适用于 Windows 的自包含可执行文件,则会创建一个 word_reader.exe 文件。 针对 Linux 或 macOS 发布时,将创建 word_reader 文件。 使用 -r <RID>
参数为 dotnet publish
命令指定目标平台和体系结构。 有关 RID 的详细信息,请参阅 .NET RID 目录。
如果应用具有特定于平台的依赖项(例如包含特定于平台的依赖项的 NuGet 包),这些依赖项会随应用一起复制到发布文件夹。
优势
控制 .NET 版本
你可以控制随应用一起部署的 .NET 版本。特定于平台的定向
由于必须为每个平台发布应用,因此你知道应用在何处运行。 如果 .NET 引入了新平台,则在发布面向该平台的版本之前,用户无法在该平台上运行应用。 可以在用户在新平台上运行应用之前测试应用的兼容性问题。
缺点
大型部署
由于您的应用程序包含 .NET 运行时和所有依赖项,因此所需的下载大小和硬盘空间大于依赖于框架的 版本。提示
IL 剪裁可以进一步减小部署的大小。
更难更新 .NET 版本
.NET 运行时(随应用一起分发)只能通过发布应用的新版本来升级。
例子
发布独立应用。 创建 macOS 64 位可执行文件。
dotnet publish -r osx-x64 --self-contained
发布独立应用。 创建 Windows 64 位可执行文件。
dotnet publish -r win-x64 --self-contained
使用 ReadyToRun 映像发布
使用 ReadyToRun 映像进行发布可提高应用程序的启动时间,代价是增加应用程序的大小。 有关详细信息,请参阅 ReadyToRun。
优势
- 改进了启动时间
应用程序在运行 JIT 时花费的时间更少。
劣势
- 增加了大小
这个应用程序在磁盘上占用的空间更大。
例子
使用 ReadyToRun 映像发布独立式应用。 创建 macOS 64 位可执行文件。
dotnet publish -c Release -r osx-x64 --self-contained -p:PublishReadyToRun=true
发布一个自包含且具备 ReadyToRun(预备运行)功能的应用程序。 创建 Windows 64 位可执行文件。
dotnet publish -c Release -r win-x64 --self-contained -p:PublishReadyToRun=true