使用命令行在 Windows/Linux/macOS 上入门 .NET Core
本主题将演示如何使用 .NET Core CLI 工具开始在计算机上开发跨平台应用。
如果熟悉 .NET Core CLI 工具集,请阅读 .NET Core SDK 概述。
系统必备
- .NET Core SDK 2.1。
- 按需选择的文本编辑器或代码编辑器。
Hello,控制台应用!
若要查看或下载示例代码,可以访问 dotnet/samples GitHub 存储库。 有关下载说明,请参阅示例和教程。
打开命令提示符,创建一个名为“Hello”的文件夹。 导航到创建的文件夹,键入下列内容:
$ dotnet new console
$ dotnet run
让我们进行快速演练:
-
$ dotnet new console
dotnet new
会创建一个最新的Hello.csproj
项目文件,其中包含生成控制台应用所必需的依赖项。 它还将创建Program.cs
,这是包含应用程序的入口点的基本文件。Hello.csproj
:<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>netcoreapp2.2</TargetFramework> </PropertyGroup> </Project>
项目文件指定还原依赖项和生成程序所需的一切。
OutputType
标记指定我们要生成的可执行文件,即控制台应用程序。TargetFramework
标记指定了要面向的 .NET 实现。 在高级方案中,可以指定多个目标框架,并在单个操作中生成所有目标框架。 在本教程中,我们将仅针对 .NET Core 2.2 进行生成。
Program.cs
:using System; namespace Hello { class Program { static void Main(string[] args) { Console.WriteLine("Hello World!"); } } }
该程序从
using System
开始,这意味着“将System
命名空间中的所有内容都纳入此文件的作用域”。System
命名空间包括基本的结构,如string
或数值类型。接着定义一个名为
Hello
的命名空间。 你可以将其更改为任何你喜欢的名称。 在该命名空间中定义了一个名为Program
的类,其中Main
方法将字符串数组作为其参数。 此数组包含了在调用编译的程序时所传递的参数列表。 如其所示,此数组没有被使用:程序所进行的全部操作就是输出 “Hello World!” 。 稍后将对代码进行更改,以使用此数组。备注
从 .NET Core 2.0 SDK 开始,无需运行
dotnet restore
,因为它由所有需要还原的命令隐式运行,如dotnet new
、dotnet build
和dotnet run
。 在执行显式还原有意义的某些情况下,例如 Azure DevOps Services 中的持续集成生成中,或在需要显式控制还原发生时间的生成系统中,它仍然是有效的命令。dotnet new
隐式调用dotnet restore
。dotnet restore
调用到 NuGet(.NET 包管理器)以还原依赖项树。 NuGet 分析 Hello.csproj 文件、下载文件中定义的依赖项(或从计算机缓存中获取)并写入 obj/project.assets.json 文件,该文件在编译和运行示例时需要使用。重要
如果你使用的是 .NET Core 1.x 版本的 SDK,在调用
dotnet new
后,必须自行调用dotnet restore
。 -
$ dotnet run
dotnet run
调用dotnet build
来确保已生成要生成的目标,然后调用dotnet <assembly.dll>
运行目标应用程序。$ dotnet run Hello World!
或者,还可以执行
dotnet build
来编译代码,而不运行已生成的控制台应用程序。 这使得编译的应用程序(作为 DLL 文件)可以在 Windows 上使用dotnet bin\Debug\netcoreapp2.1\Hello.dll
运行(将/
用于非 Windows 系统)。 还可以对应用程序指定参数,相关操作将在本主题稍后部分进行介绍。$ dotnet bin\Debug\netcoreapp2.1\Hello.dll Hello World!
在高级方案中,可以将应用程序作为自包含的、特定于平台的文件集生成,该应用程序可以在未安装 .NET Core 的计算机上部署或运行。 请参阅 .NET Core 应用程序部署了解详细信息。
扩充程序
让我们稍微更改一下程序。 Fibonacci 数字很有意思,让我们来添加 Fibonacci 数字,另外,也使用参数来和运行应用的用户打个招呼。
-
将 Program.cs 文件的内容替换为以下代码:
using System; namespace Hello { class Program { static void Main(string[] args) { if (args.Length > 0) { Console.WriteLine($"Hello {args[0]}!"); } else { Console.WriteLine("Hello!"); } Console.WriteLine("Fibonacci Numbers 1-15:"); for (int i = 0; i < 15; i++) { Console.WriteLine($"{i + 1}: {FibonacciNumber(i)}"); } } static int FibonacciNumber(int n) { int a = 0; int b = 1; int tmp; for (int i = 0; i < n; i++) { tmp = a; a = b; b += tmp; } return a; } } }
-
执行
dotnet build
以编译更改。 -
运行向应用传递参数的程序:
$ dotnet run -- John Hello John! Fibonacci Numbers 1-15: 1: 0 2: 1 3: 1 4: 2 5: 3 6: 5 7: 8 8: 13 9: 21 10: 34 11: 55 12: 89 13: 144 14: 233 15: 377
就是这么简单! 可以按任意喜欢的方式扩充 Program.cs
。
使用多个文件
对于简单的一次性程序,使用单个文件即可,但如果要生成更复杂的应用,则项目上可能需要多个源文件。让我们通过缓存一些 Fibonacci 值,基于之前的 Fibonacci 示例来生成这类应用,并添加一些递归特性。
-
使用以下代码将新文件添加到名为 FibonacciGenerator.cs 的 Hello 目录:
using System; using System.Collections.Generic; namespace Hello { public class FibonacciGenerator { private Dictionary<int, int> _cache = new Dictionary<int, int>(); private int Fib(int n) => n < 2 ? n : FibValue(n - 1) + FibValue(n - 2); private int FibValue(int n) { if (!_cache.ContainsKey(n)) { _cache.Add(n, Fib(n)); } return _cache[n]; } public IEnumerable<int> Generate(int n) { for (int i = 0; i < n; i++) { yield return FibValue(i); } } } }
-
更改 Program.cs 文件中的
Main
方法,以实例化新的类并调用其方法,如下例所示:using System; namespace Hello { class Program { static void Main(string[] args) { var generator = new FibonacciGenerator(); foreach (var digit in generator.Generate(15)) { Console.WriteLine(digit); } } } }
-
执行
dotnet build
以编译更改。 -
通过执行
dotnet run
来运行应用。 以下是程序输出:$ dotnet run 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
就是这么简单! 现在,可以开始使用此处学到的基本概念来创建自己的程序了。
请注意,本教程中用来运行应用程序的命令和步骤仅用于开发过程。 准备好部署应用后,需要查看适用于 .NET Core 应用的不同部署策略和 dotnet publish
命令。