可将 .NET Core 应用程序部署为依赖框架的部署或独立部署,前者包含应用程序二进制文件,但依赖目标系统上存在的 .NET Core,而后者同时包含应用程序和 .NET Core 二进制文件。 有关 .NET Core 应用程序部署的概述,请参阅 .NET Core 应用程序部署。
以下部分演示如何使用 Microsoft Visual Studio 创建以下类型的部署:
- 依赖框架的部署
- 依赖框架的部署及其第三方依赖项
- 独立部署
- 包含第三方依赖项的独立部署
有关使用 Visual Studio 开发 .NET Core 应用程序的信息,请参阅 .NET Core 依赖项和要求。
依赖框架的部署
部署框架依赖的应用,非常简单地涉及生成、测试和发布,无需任何第三方依赖项。 用 C# 编写的简单示例说明了该过程。
创建项目。
选择“文件”>“新建”>“项目”。 在“ 新建项目 ”对话框中,展开 “已安装 项目类型”窗格中的语言(C# 或 Visual Basic)项目类别,选择 .NET Core,然后在中心窗格中选择 控制台应用(.NET Core) 模板。 在“ 名称 ”文本框中输入项目名称,例如“FDD”。 选择“确定”按钮。
添加应用程序的源代码。
在编辑器中打开 Program.cs 或 Program.vb 文件,并将自动生成的代码替换为以下代码。 它会提示用户输入文本并显示用户输入的单个单词。 它使用正则表达式
\w+
分隔输入文本中的单词。using System; using System.Text.RegularExpressions; namespace Applications.ConsoleApps { public class ConsoleParser { public static void Main() { Console.WriteLine("Enter any text, followed by <Enter>:\n"); String? s = Console.ReadLine(); ShowWords(s ?? "You didn't enter anything."); Console.Write("\nPress any key to continue... "); Console.ReadKey(); } private static void ShowWords(String s) { String pattern = @"\w+"; var matches = Regex.Matches(s, pattern); if (matches.Count == 0) { Console.WriteLine("\nNo words were identified in your input."); } else { Console.WriteLine($"\nThere are {matches.Count} words in your string:"); for (int ctr = 0; ctr < matches.Count; ctr++) { Console.WriteLine($" #{ctr,2}: '{matches[ctr].Value}' at position {matches[ctr].Index}"); } } } } }
Imports System.Text.RegularExpressions Namespace Applications.ConsoleApps Public Module ConsoleParser Public Sub Main() Console.WriteLine("Enter any text, followed by <Enter>:") Console.WriteLine() Dim s = Console.ReadLine() ShowWords(s) Console.Write($"{vbCrLf}Press any key to continue... ") Console.ReadKey() End Sub Private Sub ShowWords(s As String) Dim pattern = "\w+" Dim matches = Regex.Matches(s, pattern) Console.WriteLine() If matches.Count = 0 Then Console.WriteLine("No words were identified in your input.") Else Console.WriteLine($"There are {matches.Count} words in your string:") For ctr = 0 To matches.Count - 1 Console.WriteLine($" #{ctr,2}: '{matches(ctr).Value}' at position {matches(ctr).Index}") Next End If Console.WriteLine() End Sub End Module End Namespace
创建应用的调试版本。
选择“生成”“生成解决方案” 。 还可以通过选择“调试开始调试”来编译和运行应用程序的>版本。
部署应用。
调试并测试程序后,创建要随应用一起部署的文件。 若要从 Visual Studio 发布,请执行以下作:
将解决方案配置从 “调试” 更改为工具栏上的 “发布 ”,以生成应用的“发布”版本(而不是调试)版本。
右键单击 解决方案资源管理器 中的项目(而不是解决方案),然后选择“ 发布”。
在“ 发布 ”选项卡中,选择“ 发布”。 Visual Studio 将构成应用程序的文件写入本地文件系统。
“发布”选项卡现在显示单个配置文件 FolderProfile。 该配置文件的配置设置显示在选项卡的“摘要”部分。
生成的文件放置在名为
Publish
的 Windows 目录和名为publish
的 Unix 系统目录中,这些目录位于项目的 .\bin\release\netcoreapp2.1 子目录的子目录中。
与应用程序的文件一起,发布过程会发出一个程序数据库 (.pdb) 文件,其中包含有关应用的调试信息。 该文件主要用于调试异常。 您可以选择不将其与应用程序文件一起打包。 但是,您应该将其保留,以便在需要调试应用的发布版本时使用。
以任意方式部署完整的应用程序文件集。 例如,可以将它们打包到 Zip 文件中,使用简单的 copy
命令,或者将它们与所选的任何安装包一起部署。 安装后,用户即可使用 dotnet
命令执行应用程序,并提供应用程序文件名,例如 dotnet fdd.dll
。
除了应用程序二进制文件外,安装程序还应捆绑共享框架的安装程序,或者在应用程序安装时检查其是否满足先决条件。 安装共享框架需要管理员/根访问权限,因为它是计算机范围的。
依赖框架的部署及其第三方依赖项
要使用一个或多个第三方依赖项来部署依赖框架的部署,需要任何依赖项都可供项目使用。 在生成应用之前,需要执行以下附加步骤:
使用 NuGet 包管理器 向项目添加对 NuGet 包的引用;如果包在你的系统上尚不可用,请安装它。 若要打开包管理器,请选择“ 工具>NuGet 包管理器>管理解决方案的 NuGet 包”。
确认你的第三方依赖项(例如,
Newtonsoft.Json
)安装在系统上,如果不是,请安装它们。 “ 已安装 ”选项卡列出了系统上安装的 NuGet 包。 如果Newtonsoft.Json
未在列表中显示,请选择“浏览”选项卡,然后在搜索框中输入“Newtonsoft.Json”。 选择Newtonsoft.Json
,在右窗格中选择您的项目,然后选择 安装。如果
Newtonsoft.Json
已在系统上安装,请在“ 管理解决方案包 ”选项卡的右侧窗格中选择项目,将其添加到项目中。
依赖于框架且具有第三方依赖项的部署,其可移植性与第三方依赖项的可移植性一致。 例如,如果第三方库仅支持 macOS,则应用无法移植到 Windows 系统。 如果第三方依赖项本身依赖于本机代码,则会发生这种情况。 一个很好的示例是 Kestrel 服务器,它需要 libuv 的本机依赖项。 为具有此类第三方依赖项的应用程序创建 FDD 时,已发布的输出中包含若干文件夹,分别对应本机依赖项支持的每个 运行时标识符 (RID),而这些 RID 也存在于其 NuGet 包中。
不依赖第三方的独立部署
部署不包含第三方依赖项的自包含部署涉及创建项目、修改 csproj 文件、生成、测试和发布应用。 用 C# 编写的简单示例说明了该过程。 首先创建、编码和测试项目,就像创建依赖于框架的部署一样:
创建项目。
选择“文件”>“新建”>“项目”。 在“ 新建项目 ”对话框中,展开 “已安装 项目类型”窗格中的语言(C# 或 Visual Basic)项目类别,选择 .NET Core,然后在中心窗格中选择 控制台应用(.NET Core) 模板。 在“ 名称 ”文本框中输入项目名称,例如“SCD”,然后选择“ 确定 ”按钮。
添加应用程序的源代码。
在编辑器中打开 Program.cs 或 Program.vb 文件,并将自动生成的代码替换为以下代码。 它会提示用户输入文本并显示用户输入的单个单词。 它使用正则表达式
\w+
分隔输入文本中的单词。using System; using System.Text.RegularExpressions; namespace Applications.ConsoleApps { public class ConsoleParser { public static void Main() { Console.WriteLine("Enter any text, followed by <Enter>:\n"); String? s = Console.ReadLine(); ShowWords(s ?? "You didn't enter anything."); Console.Write("\nPress any key to continue... "); Console.ReadKey(); } private static void ShowWords(String s) { String pattern = @"\w+"; var matches = Regex.Matches(s, pattern); if (matches.Count == 0) { Console.WriteLine("\nNo words were identified in your input."); } else { Console.WriteLine($"\nThere are {matches.Count} words in your string:"); for (int ctr = 0; ctr < matches.Count; ctr++) { Console.WriteLine($" #{ctr,2}: '{matches[ctr].Value}' at position {matches[ctr].Index}"); } } } } }
Imports System.Text.RegularExpressions Namespace Applications.ConsoleApps Public Module ConsoleParser Public Sub Main() Console.WriteLine("Enter any text, followed by <Enter>:") Console.WriteLine() Dim s = Console.ReadLine() ShowWords(s) Console.Write($"{vbCrLf}Press any key to continue... ") Console.ReadKey() End Sub Private Sub ShowWords(s As String) Dim pattern = "\w+" Dim matches = Regex.Matches(s, pattern) Console.WriteLine() If matches.Count = 0 Then Console.WriteLine("No words were identified in your input.") Else Console.WriteLine($"There are {matches.Count} words in your string:") For ctr = 0 To matches.Count - 1 Console.WriteLine($" #{ctr,2}: '{matches(ctr).Value}' at position {matches(ctr).Index}") Next End If Console.WriteLine() End Sub End Module End Namespace
确定是否要使用不变的全球化模式。
特别是如果你的应用面向 Linux,则可以利用 全球化固定模式来减少部署的总大小。 全球化不变模式对于不具备全球意识且可以使用不变文化的格式设置惯例、大小写惯例以及字符串比较和排序顺序的应用程序非常有用。
若要启用固定模式,请在解决方案资源管理器中右键单击项目(而不是解决方案),然后选择“编辑 SCD.csproj”或“编辑 SCD.vbproj”。 然后将以下突出显示的行添加到该文件:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>net8.0</TargetFramework> <Nullable>enable</Nullable> </PropertyGroup> <ItemGroup> <RuntimeHostConfigurationOption Include="System.Globalization.Invariant" Value="true" /> </ItemGroup> </Project>
创建应用程序的调试版本。
选择“生成”“生成解决方案” 。 还可以通过选择“调试开始调试”来编译和运行应用程序的>版本。 通过此调试步骤,可以识别应用程序在主机平台上运行时遇到的问题。 你仍必须在每个目标平台上对其进行测试。
如果已启用全球化不变模式,请务必测试缺乏文化敏感数据是否适合您的应用程序。
完成调试后,可以发布独立部署:
调试并测试程序后,为它面向的每个平台创建要随应用一起部署的文件。
若要从 Visual Studio 发布应用,请执行以下作:
定义应用将面向的平台。
右键单击 解决方案资源管理器 中的项目(而不是解决方案),然后选择 “编辑 SCD.csproj”。
在
<RuntimeIdentifiers>
<PropertyGroup>
文件的部分中创建一个标记,用于定义应用目标的平台,并指定目标每个平台的运行时标识符(RID)。 还需要添加分号来分隔 RID。 有关运行时标识符列表,请参阅 运行时标识符目录 。
例如,以下示例指示应用在 64 位 Windows作系统和 64 位 OS X作系统上运行。
<PropertyGroup> <RuntimeIdentifiers>win-x64;osx-x64</RuntimeIdentifiers> </PropertyGroup>
<RuntimeIdentifiers>
元素可能会进入 csproj 文件的任何<PropertyGroup>
中。 本节稍后会显示完整的 示例 csproj 文件。发布你的应用。
调试并测试程序后,为它面向的每个平台创建要随应用一起部署的文件。
若要从 Visual Studio 发布应用,请执行以下作:
将解决方案配置从 “调试” 更改为工具栏上的 “发布 ”,以生成应用的“发布”版本(而不是调试)版本。
右键单击 解决方案资源管理器 中的项目(而不是解决方案),然后选择“ 发布”。
在“ 发布 ”选项卡中,选择“ 发布”。 Visual Studio 将构成应用程序的文件写入本地文件系统。
“发布”选项卡现在显示单个配置文件 FolderProfile。 该配置文件的配置设置显示在选项卡的摘要部分。目标运行时用于标识已发布的运行时,目标位置用于标识独立部署文件的写入位置。
默认情况下,Visual Studio 将所有已发布的文件写入单个目录。 为方便起见,最好为每个目标运行时创建单独的配置文件,并将已发布的文件放置在特定于平台的目录中。 这涉及到为每个目标平台创建单独的发布配置文件。 因此,现在为每个平台重新构建应用程序,具体步骤如下:
在“发布”对话框中选择“创建新配置文件”。
在 “选取发布目标 ”对话框中,将 “选择文件夹 位置”更改为 bin\Release\PublishOutput\win-x64。 选择“确定”。
在配置文件列表中选择新的配置文件(FolderProfile1),并确保 目标运行时 为
win-x64
。 如果不是,请选择 “设置”。 在 “配置文件设置” 对话框中,将 目标运行时 更改为win-x64
并选择“ 保存”。 否则,请选择“ 取消”。选择 “发布 ”以发布适用于 64 位 Windows 10 平台的应用。
再次执行前面的步骤,为
osx-x64
平台创建配置文件。 目标位置为 bin\Release\PublishOutput\osx-x64,目标运行时为osx-x64
。 Visual Studio 分配给此配置文件的名称为 FolderProfile2。
每个目标位置都包含启动应用所需的完整文件集(应用文件和所有 .NET Core 文件)。
与应用程序的文件一起,发布过程会发出一个程序数据库 (.pdb) 文件,其中包含有关应用的调试信息。 该文件主要用于调试异常。 您可以选择不将其与应用程序文件一起打包。 但是,您应该将其保留,以便在需要调试应用的发布版本时使用。
以任意方式部署已发布的文件。 例如,可以将它们打包到 Zip 文件中,使用简单的 copy
命令,或者将它们与所选的任何安装包一起部署。
下面是此项目的完整 csproj 文件。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.1</TargetFramework>
<RuntimeIdentifiers>win-x64;osx-x64</RuntimeIdentifiers>
</PropertyGroup>
</Project>
包含第三方依赖项的独立部署
进行自包含部署且需要一个或多个第三方依赖项时,必须添加这些依赖项。 在生成应用之前,需要执行以下附加步骤:
使用 NuGet 包管理器 向项目添加对 NuGet 包的引用;如果包在你的系统上尚不可用,请安装它。 若要打开包管理器,请选择“ 工具>NuGet 包管理器>管理解决方案的 NuGet 包”。
确认你的第三方依赖项(例如,
Newtonsoft.Json
)安装在系统上,如果不是,请安装它们。 “ 已安装 ”选项卡列出了系统上安装的 NuGet 包。 如果Newtonsoft.Json
未在列表中显示,请选择“浏览”选项卡,然后在搜索框中输入“Newtonsoft.Json”。 选择Newtonsoft.Json
,在右窗格中选择您的项目,然后选择 安装。如果
Newtonsoft.Json
已在系统上安装,请在“ 管理解决方案包 ”选项卡的右侧窗格中选择项目,将其添加到项目中。
下面是此项目的完整 csproj 文件:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.1</TargetFramework>
<RuntimeIdentifiers>win-x64;osx-x64</RuntimeIdentifiers>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="10.0.2" />
</ItemGroup>
</Project>
部署应用程序时,应用中使用的任何第三方依赖项也包含在应用程序文件中。 运行应用的系统不需要第三方库。
可以只将具有一个第三方库的独立部署部署到该库支持的平台。 类似于在依赖框架的部署中使用带有本机依赖项的第三方依赖项,其中,本机依赖项如果未事先安装就不会存在于目标平台上。