使用.NET Core创建的应用程序可以两种不同的模式发布,该模式会影响用户运行您的应用程序的方式。以自包含的方式发布您的应用程序将产生一个包含.NET Core运行时和库以及您的应用程序及其依赖项的应用程序。应用程序的用户可以在未安装.NET Core运行时的计算机上运行它。以依赖于运行时的方式(以前称为依赖框架)发布您的应用程序会生成一个仅包含应用程序本身及其依赖项的应用程序。应用程序的用户必须单独安装.NET Core运行时。

1、生成可执行文件

可执行文件不是跨平台的。它们特定于操作系统和CPU体系结构。发布应用程序并创建可执行文件时,可以将应用程序发布为self-contained 或 runtime-dependent。以自包含的方式发布应用程序包括该应用程序的.NET Core运行时,并且该应用程序的用户不必担心在运行该应用程序之前安装.NET Core。发布为与运行时相关的应用程序不包括.NET Core运行时和库;仅包括应用程序和第三方依赖关系。

1) .NET Core SDK 2.1

dotnet publish -r <RID> : 独立的可执行文件。

2) .NET Core SDK 3.x

dotnet publish -r <RID> --self-contained false : 特定平台的与运行时相关的可执行文件。

dotnet publish : 当前平台的与运行时相关的可执行文件。

dotnet publish -r <RID> : 独立的可执行文件。

2、生成跨平台的二进制文件(.dll)

当您将应用程序发布为依赖于运行时的dll文件形式时,会创建跨平台的二进制文件。该dll文件以您的项目命名。例如,如果您有一个名为应用程序word_reader,文件名为word_reader.dll创建。以这种方式发布的应用程序dotnet <filename.dll>可以通过命令运行,并且可以在任何平台上运行。

只要已经安装了目标.NET Core运行时,跨平台二进制文件就可以在任何操作系统上运行。如果未安装目标.NET Core运行时,则如果该应用配置为前滚,则该应用可以使用较新的运行时运行。

.NET Core SDK2.1和3.x生成跨平台二制文件命令:

dotnet publish :运行时相关的跨平台二进制文件。

3、依赖运行时发布部署生成项目

发布为与运行时相关的应用程序是跨平台的,并且不包括.NET Core运行时。应用程序的用户需要安装.NET Core运行时。

以依赖于运行时的方式发布应用程序会生成一个跨平台的二进制文件(如dll文件)和针对您当前平台的特定于平台的可执行文件。该DLL是跨平台的,而可执行文件是没有的。例如,如果您发布一个名为word_reader的应用程序并目标Windows,则会创建一个word_reader.exe可执行文件以及word_reader.dll。当针对Linux或macOS时,将与word_reader.dll一起创建word_reader可执行文件。

注意:发布依赖于运行时的应用程序时,.NET Core SDK 2.1不会生成特定于平台的可执行文件。

应用程序的跨平台二进制文件可以使用dotnet <filename.dll>命令运行,并且可以在任何平台上运行。如果应用程序使用具有特定于平台的实现的NuGet软件包,则所有平台的依赖项都将与应用程序一起复制到publish文件夹中。

您可以通过将-r <RID> --self-contained false参数传递给dotnet publish命令来为特定平台创建可执行文件。当-r参数被省略,为您的当前平台创建一个可执行文件。具有目标平台特定于平台的依赖关系的所有NuGet软件包都将复制到publish文件夹中。

1) 优点

部署的程序文件较小:仅分发应用程序及其依赖项。.NET Core运行时和库由用户安装,所有应用共享该运行时。

跨平台:您的应用程序和任何基于.NET的库都可以在其他操作系统上运行。您无需为应用程序定义目标平台。有关.NET文件格式的信息,请参见.NET程序集文件格式

更新运行时较容易:该应用程序使用目标系统上安装的最新运行时。这意味着应用将自动使用.NET Core运行时的最新修补版本。此默认行为可以被覆盖。

2) 缺点

需要预安装运行时 :仅当您的应用程序目标的.NET Core版本已在主机系统上安装时,您的应用程序才能运行。您可以为应用程序配置前滚行为,以要求特定版本的.NET Core或允许更高版本的.NET Core。

.NET Core 2.1 SDK : 用户必须运行dotnet <filename.dll>命令才能启动应用程序。.NET Core 2.1 SDK不会为依赖于运行时发布的应用程序生成特定于平台的可执行文件。

4、独立发布部署生成项目

以自包含的方式发布您的应用会生成特定于平台的可执行文件。输出发布文件夹包含应用程序的所有组件,包括.NET Core库和目标运行时。该应用程序与其他.NET Core应用程序隔离,并且不使用本地安装的共享运行时。您的应用程序用户无需下载并安装.NET Core。

可执行二进制文件针对指定的目标平台生成。例如,如果您有一个名为word_reader的应用程序,并且发布了Windows的自包含可执行文件,则会创建word_reader.exe文件。为Linux或macOS发布,将创建一个word_reader文件。使用命令的-r <RID>参数指定目标平台和体系结构dotnet publish

1) 优点

控制.NET Core版本 : 可以控制与应用程序一起部署的.NET Core版本。

特定于平台的定位 : 因为必须为每个平台发布应用程序,所以您知道应用程序将在何处运行。如果.NET Core引入了新平台,则用户必须先发布针对该平台的版本,然后才能在该平台上运行您的应用程序。您可以在用户在新平台上运行应用程序之前测试应用程序的兼容性问题。

2) 缺点

部署的程序文件较大:因为您的应用程序包含.NET Core运行时以及所有应用程序依赖项,所以所需的下载大小和硬盘空间大于依赖于运行时的版本。

注意:通过使用.NET Core globalization invariant mode.,可以将Linux系统上的部署大小减少大约28 MB 。这迫使您的应用将所有文化都视为invariant culture

难以更新.NET Core版本:.NET Core Runtime(随您的应用程序分发)只能通过发布新版本的应用程序进行升级。您负责为.NET Core Runtime提供应用程序的更新版本以获取安全补丁。

5、发布命令(dotnet publish )

1) 特定平台的与运行时相关的可执行文件

dotnet publish -r <RID> --self-contained false 

2) 当前平台的与运行时相关的可执行文件

dotnet publish 

3) 独立的可执行文件

dotnet publish -r <RID> 

4) 发布依赖于运行时的跨平台应用程序。随dll文件一起创建了Linux 64位可执行文件。该命令不适用于.NET Core SDK 2.1

dotnet publish -r linux-x64 --self-contained false 

5) 发布一个独立的应用程序。创建了macOS 64位可执行文件

dotnet publish -r osx-x64

6) 发布一个独立的应用程序。Windows 64位可执行文件已创建:

dotnet publish -r win-x64  

7) 发布可执行独立的可执行文件

dotnet puslish -r win-x86 -c Release --self-contained

8) 生成可执行文件时,可以使用运行时标识符(RID)指定目标平台

参考文档 .NET Core RID ,更多命令可以通过控制台窗口使用 dotnet --helpdotnet publish --help 查看。

注意.NET Core 2.1 SDK中用户必须运行dotnet <filename.dll>命令才能启动应用程序。.NET Core 2.1 SDK不会为依赖于运行时发布的应用程序生成特定于平台的可执行文件。

相关文档

.net core(C#)运行控制台程序(console app)的命令方法

.net core(Console)应用程序中发布创建独立可执行(.exe)文件

.net core 2.0以及之前版本控制台项目独立发布方法

https://docs.microsoft.com/en-us/dotnet/core/rid-catalog

https://docs.microsoft.com/en-us/dotnet/core/deploying/#publish-self-contained

推荐文档