.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 运行时和所有依赖项,因此所需的下载大小和硬盘空间大于依赖于框架的 版本

    提示

    通过使用 .NET 全球化不变模式,可以在 Linux 系统上将部署的大小减少约 28 MB。 这会强制应用像处理固定区域性一样处理所有区域性。

    提示

    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

另请参阅