使用 .NET Core 3 编程 Linux:引言与第 2 章
学习通过 .NET Core 3 和 Visual Studio Code 编程 Linux:入门
背景
大约一年前,我组装了一台新台式电脑,并安装了 Win10 和 Ubuntu 作为双启动系统。
我很快就爱上了 Ubuntu 和 Linux。我已经有 8 个月没有启动这台机器上的 Win10 了。
我从 Win 3.1 开始就一直在 Windows 系统上运行和开发,所以这是一个重大的转变。然而,我真的很喜欢 Microsoft 的开发环境和工作方式。当我最近发现我可以编写在 Windows 和 Linux 上都能运行的 C# 代码时,我非常兴奋。能够在 Windows 上编写代码,然后将其带到 Linux 上,无需任何更改即可构建和运行,这真是令人惊叹。不,你仍然不能在 Linux 上构建 Windows 窗体应用程序,但请放眼未来。你可以在不需要 Windows 窗体或图形用户界面的情况下完成许多其他事情。这就是我决定写这本书的原因。我只是想看看我们只使用 Visual Studio Code 和 .NET Core SDK 能做些什么。
我仍在决定书中要包含多少初始细节,所以 CodeProject 的许多读者可能会跳过数据类型和基础知识的解释,但我希望这能开启一个想法,即你可以在 Linux 上编写 C#,这真的很酷,也很有趣。
我希望实现什么
我只是想写一本易于理解(任何人都可以编写代码)的有趣书籍,让我和我的读者了解我们可以在 Linux 平台上使用 .NET Core 做些什么。我甚至希望它能有点回溯到 K&R C——尽管我的书肯定不会像那本优秀的小资源那样清晰和直接。最后,我希望我能提供一些东西,成为关于 .NET 和 C# 在 Linux 上的讨论开端,激发读者享受开发的乐趣。
引言
这本书涵盖了什么?
本书重点介绍如何使用 Visual Studio Code 和 Linux 命令行来创建和构建基于 DotNet Core 3.x 的项目和应用程序。
所有程序都将用 C# 编写。当然,基于 Web 的项目可能包括 TypeScript、JavaScript、CSS、HTML 等。
这本书适合谁?
这本书是 DotNet Core 编程 Linux 的一个非常快速的介绍。如果你是一个勇敢的初学者,你将能够使用这本书开始学习和在 Linux(我运行 Ubuntu)上使用 C# 和 DotNet Core 3.x 库编写软件。
我将尽力以一种即使你是初学者也能跟着步骤学习的方式介绍材料。但是,我可能会在某些主题上进展非常快,你可能需要其他资源才能在某些主题上获得更深入的理解。
这本书的主要受众是有一定开发经验的人。如果你已经编码了至少三到六个月并且喜欢编程,那么你在这里会做得很好。如果你有更多的经验,我相信你会发现这是一个很好的介绍,介绍你可以使用 DotNet Core 3.x 和相关技术在 Linux 上创建的各种东西。
以应用程序为中心
我将提供我涉及的所有主题的示例代码,但我不会局限于示例代码。我们将至少完成三个完整的实用工具(通常是基于控制台的 - 文本用户界面 TUI),以及一些合适的 Web 应用程序。
我不会关注用户界面问题。这本书更多关注代码,而不是用户界面(UI)。然而,我喜欢创建尽可能易于使用的应用程序,因此在适当和适用时,我将讨论创建良好的用户体验(UX),尽管这可能不总是通过图形用户界面实现。而且,当它是图形用户界面时,它可能是一个基于 Web 的用户界面。
这本书不是什么
再次强调,这本书是关于通过使用 dotnet 命令行和 Visual Studio Code 学习在 Linux 环境中编程的。它是关于学习编码,只稍微强调如何创建用户界面。如果你正在寻找创建 WinForm 应用程序的 Linux 版本,那这本书不适合你。
这本书是什么
但是,如果你对学习 dotnet core、C#、编写实用程序以及更多地了解 Linux 基础知识感兴趣,那么这里就是适合你的地方。
我真的把这本书看作是一个业余爱好者在学习 DotNet Core 编程时探索 Linux 的过程。它应该很有趣……但我是一个极客。:)
所有源代码都在 GitHub 上
我将把所有代码都放在 GitHub 仓库 (repo) 中,并且所有代码都将是开源的,可以免费用于你自己的项目。
DotNet Core
dotnet 命令行(基于控制台)应用程序非常棒,而且极其易于使用。如果你是 Linux 用户,你可能已经习惯了使用命令行。这本书将重点介绍如何使用 dotnet 控制台应用程序来完成我们能做的一切。这包括创建项目、从源文件编译和构建、添加库以及其他所有内容。
这应该能让你了解这本书将如何运作以及你将学到什么。现在,让我们开始安装 dotnet core、Visual Studio Code 并编写我们的第一个控制台应用程序。
macOS 奖励
我也在我的 MacMini 上测试了这些程序。你可以在终端窗口中安装 Visual Studio Code、.NET Core SDK 和 .NET Core 运行时并运行所有内容,尽管 Mac 默认运行 zsh (shell)。
无论你运行 Mac 还是 Linux,本书中遵循的命令都将是相同的。供你参考——安装 Visual Studio Code 和 .NET SDK 等时可能会有一些差异,但这些差异很容易就能解决。
第 2 章 - 深入 .NET Core
- Linux 终端(命令行)
- 安装 .Net Core 3 SDK 和运行时
- 安装 Visual Studio Code
- 构建并运行我们的第一个控制台(终端)程序
Linux 终端
我们首先要做的是打开一个终端并检查是否安装了 dotnet。
如果你在你的 Linux 机器上找不到终端,并且如果你正在运行 Gnome 桌面(就像我在 Ubuntu 上一样),那么你可以点击 **Activities** 菜单(它有点像 Win10 的开始按钮),然后输入:`terminal`。
最后,只需点击 **Terminal** 图标,它就会为你打开。
测试 dotnet 可执行文件
一旦你有了命令提示符,输入以下内容并按 **<ENTER>**。
dotnet --version
如果你所在的系统尚未安装 dotnet sdk,那么你将收到类似我的回复,提示找不到该命令。
安装 .NET Core SDK
让我们安装 dotnet。
打开你喜欢的网页浏览器(我的是 FireFox)并访问:https://dotnet.microsoft.com/download。
你会看到类似以下内容
继续点击 **[安装 .NET Core]** 按钮。
这将带你到一个很长的页面,列出了所有可以安装 .NET Core 的各种 Linux 发行版(我可能会在本书中不同地称呼 dotnet core)。
我运行 Ubuntu 18.04 和 Debian 10
我实际上正在运行 Ubuntu 18.04 Desktop 作为我的主机器。然而,你可能会注意到我遵循 Debian 的安装方法。那是因为我在 `VirtualBox` 实例中运行 Debian(带有 Gnome 桌面),这样我就可以向你展示所有全新的安装工作。经过测试,我确定在 Ubuntu 18.04 和 Debian 10 上安装的命令完全相同,因此它们可以互换。那是因为 Ubuntu 是基于 Debian 的。
Ubuntu 18.04 或 Debian 10
这是你在 Ubuntu 18.04 上开始安装所需的第一步
复制以下内容,粘贴到你的终端并按 **<ENTER>**,它就会开始运行。
wget https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb
-O packages-microsoft-prod.deb
完成后,复制下一行并将其粘贴到你的终端窗口中,然后按 **<ENTER>**。
sudo dpkg -i packages-microsoft-prod.deb
你可以看到第一个命令已经运行,现在终端正在等待我按 **<ENTER>** 来启动第二个命令
我实际上忘记在运行 dpkg 命令时添加 sudo,结果出错了。但这是我再次在 sudo 下运行它时发生的情况。
我输入密码后,看到了以下内容
它提到了 _sudoers_ 文件,该文件包含允许提升到超级用户状态的用户的用户名。
Linux Sudo (超级用户)
这很重要,因为这本书都是关于学习 Linux 的,你一定会遇到这类事情。
让我们看看如何解决这个问题。
输入 `su root` 并按 **<ENTER>**。
系统会提示你输入 root 密码。我希望你还记得它。:)
我输入了我的密码,现在你可以看到我已以 root 身份登录,因为在下一张图中,提示符带有 `root@debian` 前缀,显示了登录用户。
我们需要赋予我的用户帐户 raddev sudo 权限。在你的情况下,你需要赋予你的用户名 sudo 权限。
安装 Sudo
为此,你可能需要安装 sudo,就像我做的那样。
输入以下内容并按 **<ENTER>**。
apt-get install sudo -y
将用户添加到 Sudo 文件
现在你可以将用户添加到 sudo 文件中。
输入以下内容并再次按 **<ENTER>**。
sudo adduser raddev sudo
退出 Root
现在,让我们退出 root 用户。为此,请输入
exit
并按 **<ENTER>**。
你将回到你的用户帐户。现在,让我们再次尝试安装 dotnet core sdk。
注销/登录
我的没有成功。我再次尝试后发现,你需要先注销并重新登录(或重启),你的帐户才会拥有 sudo 权限,所以请注销并重新登录。这对我有效。
登录后,再次打开终端,然后再次运行以下命令
sudo dpkg -i packages-microsoft-prod.db
我的已成功安装。
安装 .NET Core SDK
.NET Core SDK 是包含所有 .NET Core 功能的库集,它允许你使用 .NET Core 编写程序。这是 Microsoft 创建的库集,它封装了操作系统调用,用于创建文件、从用户获取输入、向用户显示输出以及数千种其他功能。SDK 代表软件开发工具包。
这是你将用于构建运行在 .NET Core 之上的自定义程序的工具包。
当你学习如何使用 .NET Core SDK 编写程序时,你正在学习如何使用 .NET Core 编程。
现在我们使用以下长的多行命令安装主要的 dotnet sdk
sudo apt-get update; \
sudo apt-get install -y apt-transport-https && \
sudo apt-get update && \
sudo apt-get install -y dotnet-sdk-3.1
将其复制并粘贴到您的终端中,按 **<ENTER>**,它将开始安装。
完成后,您会看到类似以下内容
.NET Core 运行时
现在我们需要安装 DotNet Core 运行时。.NET Core 运行时是实际运行你编写的代码的应用程序。你将编写调用 .NET Core SDK 中函数的代码,然后将该代码构建成可执行文件并在 .NET 运行时中运行该代码。
这是我们将在终端窗口中运行的命令
sudo apt-get update; \
sudo apt-get install -y apt-transport-https && \
sudo apt-get update && \
sudo apt-get install -y aspnetcore-runtime-3.1
这是结果
一切都已安装
这就是 dotnet core sdk 和运行时所需的一切。让我们检查一下,看看我们有什么。
$ 提示符:Linux 终端
从现在开始,我只会向你展示 `$` 提示符,然后是你将输入的命令。
这样,我就不用一直说,按 **<ENTER>** 了。
它看起来像
$ 命令 命令选项
$ ls -al
任何时候你看到这个,就按照所示运行命令。当然,要在终端中提交任何命令,你必须按 **<ENTER>**。
Dotnet 是一个可执行文件
现在 .NET Core 已经安装,我们可以运行 dotnet 命令了。
如果我们向 dotnet 命令传递 `--version`,它将告诉我们安装的版本。
前往你的终端并输入
$ dotnet --version
**注意**:请记住,这些命令区分大小写,因此你需要完全按照此处显示的方式键入它们。
我们将用 dotnet 做很多事情,所以你会看到更多它的用途。我们将用它来创建项目、构建代码、运行应用程序等等。然而,现在,我们需要一个代码编辑器。
我们需要一个代码编辑器
我们正在开发我们的第一个应用程序。然而,我们需要一个编辑器,它将使编写代码变得更容易。当然,我们在这本书中使用的编辑器是免费的 Visual Studio Code。
Visual Studio Code 不是 Visual Studio
请记住,Visual Studio Code 是一个轻量级编辑器(与 Visual Studio 相比)。
Visual Studio 实际上不能在 Linux 上运行。有 Mac 版本的 Visual Studio,但没有 Linux 版本。但这没关系,因为 Visual Studio Code 是一个很棒的编辑器,非常接近一个完整的 IDE(集成开发环境)。
Visual Studio Code 没有 Visual Studio 所有的项目模板和工具,但我相信一旦你运行它,你会感到惊讶。
我们最终将学习如何添加一个调试器插件,它将允许我们逐步执行代码。
安装 Visual Studio Code (VSC)
要了解有关 VSC 的更多信息,只需将您喜欢的浏览器指向:https://vscode.js.cn
然而,有比从网站下载 Debian 包更好的方式来安装 Visual Studio Code。我将引导你完成在 Linux 上安装 Visual Studio Code 的最流畅和最佳方法。
是的,这需要更多的终端安装。运行以下命令
$ sudo apt update
接下来,运行这个
$ sudo apt install software-properties-common apt-transport-https curl
它会确认您是否要安装软件包。输入 `y` 并按 <ENTER>
现在我们使用 curl 导入获取 Microsoft 应用程序所需的 Microsoft GPG 密钥(安全密钥)。
必须将 Visual Studio Code 仓库添加到我们的系统中,以便可以安装它。
注意:以下命令很长,会换行,但其中没有回车符。
$ sudo add-apt-repository "deb [arch=amd64]
https://packages.microsoft.com/repos/vscode stable main"
没有输出,它只是安装仓库并返回到提示符。
运行以下命令
$ sudo apt update
您可以看到新的 Microsoft 仓库列表现在已读取。
运行 Visual Studio Code 的安装
现在,我们终于可以安装 Visual Studio Code 了。
$ sudo apt install code
Visual Studio Code 安装完成
Visual Studio Code 已正式安装。
让我们启动它。
点击 **Activities** 并在搜索栏中输入“`Visual`”。您将看到 Visual Studio Code 图标。
点击图标,Visual Studio Code 将启动。
要学习如何使用 Visual Studio Code (VSC),我们需要创建一个项目,这样我们就可以开始研究 Visual Studio Code 的众多功能。
创建新项目
让我们切换回终端窗口,并使用 dotnet 命令行工具创建一个项目。
设置目录
让我们花点时间谈谈我是如何设置目录来组织我的开发工作的。
在我的主目录下,我创建了一个名为 _dev_ 的目录。
在该目录下,我将有以我正在处理的各种技术类型命名的目录,例如 webdev、dotnet、C++ 等。
在我们的例子中,从我们的主目录中,我们将创建一个名为 _dev_ 的目录,然后在该目录下再创建一个 _dotnet_ 目录。
Linux 提示符显示什么
这是我在此目录中时我的提示符的样子
raddev@raddev-1:~/dev/dotnet$
这意味着用户 raddev 登录到名为 raddev-1 的计算机。
在冒号 (:) 之后,您可以看到当前路径为 _~/dev/dotnet_,最后是提示符 `$`。您输入的任何内容都位于 `$` 提示符之后。
主目录
请记住,_~_ 代表您的主目录。这意味着如果您发出命令
$ cd ~
那么你将被移动到你的主目录。
但是,该目录的完整路径是 _/home/username_,其中 username 是您的用户名。
打印工作目录 (pwd)
如果你想查看你当前所在目录的完整路径,你可以发出 `pwd` 命令
$ pwd
如你所见,我执行了切换目录(`cd`)到家目录 _~_,然后我执行了 pwd,现在我在 _/home/raddev_ 目录中。
现在你对你在 Linux 文件系统中的位置有了更好的了解。
我在我的 _home_ 目录下创建了一个 _dev_ 目录。在 _dev_ 目录下,我创建了一个 _dotnet_ 目录。我将从我的家目录回到该目录,使用
$cd dev/dotnet
创建目录 (mkdir)
您可以复制/粘贴以下命令并立即运行它,然后您将拥有与我相同的目录结构。
$ mkdir -p ~/dev/dotnet
这将在您的 _home_ 目录下创建 _dev_ 目录,并在 _dev_ 目录下创建 _dotnet_ 目录。
`-p` 参数会创建任何可能不存在的父目录(_dev_)。
主目录 (~) 真的很有帮助
~ 代表您的主目录 _/home/username_,这非常酷,因为我不需要知道您的用户名就可以为您提供一个好的 `mkdir` 命令。相反,我们只是使用 ~ 来引用路径的那部分。
运行命令后,请继续将目录更改为该目录。
$ cd ~/dev/dotnet
一旦你进入该目录,你会知道你已经进入了,因为你会看到路径在 $ 提示符之前。
我们已准备好创建一个新的 dotnet 项目。
我们将创建一个简单的控制台(终端)程序。这非常容易。
我们只需告诉 dotnet 两件事
- 我们想创建的项目类型(控制台)
- 我们必须告诉它项目的类型,因为,正如你将看到的,你可以使用 dotnet 命令创建许多不同类型的 .NET 项目。
-
我们想给新项目起什么名字。
dotnet new
确保你位于正确的文件夹中(_~/dev/dotnet/_)。继续运行命令
$dotnet new console -o FirstConsole
文件夹中的文件夹
dotnet 命令中的 `-o` 告诉 dotnet 项目的输出名称。这将在你当前所在的文件夹中创建一个新文件夹。这就是为什么你想在 _~/dev/dotnet_ 文件夹中。当项目创建时,你将有一个新文件夹 _~/deve/dotnet/FirstConsole/_,该文件夹内将包含 dotnet 命令创建的所有项目文件。
切换到新项目目录
$ cd FirstConsole
列出目录(`lsl`)
$ ls -al
这个项目中只有一个源文件(_Program.cs_)。另一个文件是项目文件。
我们现在就可以构建程序。
$ dotnet build
程序编译并构建成功,因为我们没有收到任何警告或错误。
现在,我们可以运行程序了。
$ dotnet run
就是这样。只有一行输出。
顺便说一句,当你发出一个命令时,dotnet 会为你构建并运行应用程序
$ dotnet run
这样,如果你只是想运行应用程序但又做了更改,那么你只需发出那一个命令,dotnet 就会为你完成所有工作。
Visual Studio Code
让我们在 Visual Studio Code 中打开这个项目,查看源代码,结束本章。
如果 VSC 没有打开,请打开它。
您将看到 VSC 中的正常启动页面。
转到 **[文件]** 菜单并选择 **[打开文件夹...]** 菜单项。
一旦你选择了菜单项,一个文件浏览器应用程序将打开。
您将点击左侧的 **[主页]**,然后导航到 _dev/dotnet/_,并选择 dotnet 为您的项目创建的 _FirstConsole_ 文件夹。
一旦您点击 _FirstConsole_ 文件夹,然后点击右上角的 **[确定]** 按钮。
Visual Studio Code 将加载文件夹和文件,并将其显示在左侧的文件视图中。
您可以看到 VSC 标题栏包含项目名称 (`FirstConsole`)。
而且,左侧有七个图标(顶部 5 个,底部 2 个),它们允许您导航到其他 VSC 功能。
目前,文件视图图标处于选中状态。
放大镜是搜索功能。
三节点形状允许您访问 Git,版本控制软件。 这允许您跟踪源代码中的更改。
带有三角形的错误图标允许您访问调试器。
带有四个方块的图标 允许您访问插件,这些插件可帮助您扩展 VSC 的功能。其中一个将是至关重要的,因为它将提供 Intellisense 功能(代码补全和信息),并允许我们逐行调试和单步执行 C# 代码。
圆形人物图标允许您登录您的 Microsoft 开发者帐户。
最后,齿轮图标可以帮助你进入 VSC 配置项,并检查更新等。
目前没有文件打开,但我们点击文件导航器中的 _Program.cs_ 文件,这样我们就可以编辑一些代码。
安装插件
当您点击该项目时,您将看到代码出现在右侧,并且在 VSC 的右侧下方将出现一个小弹出对话框。
VSC 知道你打开了一个 C# 文件,所以它试图通过告诉你安装 C# 插件来提供额外的功能。继续点击 **[安装]** 按钮。
当您这样做时,它将开始安装。
请注意,插件图标现在已选中(高亮显示为白色)。您可以看到已安装了适用于 Linux (x64) 的 OmniSharp 软件包。
再次点击文件导航器图标(顶部图标),这样您就可以再次看到您的 C# _Program.cs_ 文件。
选择左侧的 _Program.cs_ 文件,文件将在编辑器中打开。
让我们更改输出到控制台(终端)的文本,使其不再是“`Hello World!`”,而是显示“`Hello, Linux-World!`”。
你只需点击文件内部并在双引号之间键入该代码即可。
Console.WriteLine("Hello, Linux-World!");
带数字的小蓝圈
您可能会在左上角的文档图标上方看到一个带有数字的小蓝圈。这表示文件已更改但尚未保存。
继续保存文件 (CTRL+s),蓝色圆圈就会消失。显然,要让您在运行程序时看到源代码中所做的更改,您必须将它们保存到文件中。
切换回你的终端。你应该还在 _~/dev/dotnet/FirstConsole_ 目录下。
运行以下命令,您将看到所做的更改。请记住,当您执行 `run` 命令时,您也在告诉 dotnet 如果有更改则构建源代码。
$ dotnet run
程序如何工作?
基本代码简单地定义了一个 `Main()` 方法或函数。这被认为是应用程序的入口点。这意味着一切都从这里开始。
这意味着当你告诉 dotnet 构建应用程序时,它会设置一些内部东西,以便操作系统知道从哪里开始程序。
当这个程序启动时,它只有一个命令要运行(`Console.WriteLine`)。
System.Console 库
该命令实际上是 C# 开发者编写的一个函数。实际的函数名是 `WriteLine`,但他们将该函数放在名为 `Console` 的库中。他们这样做是为了组织函数。实际上,该库的完整名称是 `System.Console`。
你之所以看不到 `System` 部分的名称,是因为它已添加到 _Program.cs_ 文件的顶部(使用 `using System;`),这样你就无需每次都输入它。
像盒子一样的图书馆
你可以把这些库想象成盒子。当你想要运行一个特定的函数时,你需要找到正确的盒子并查看其中。有些盒子(库)里面还有其他的盒子。
在我们的例子中,我们查看了 System 库(盒子),找到了 Console 库,然后在其内部找到了一个名为 `WriteLine()` 的方法或函数,它知道如何将消息输出到终端(控制台)窗口。
你可以在 Microsoft 的开发者网站上查找此库和函数。它看起来像以下内容
https://docs.microsoft.com/zh-cn/dotnet/api/system.console.writeline?view=netcore-3.1
请注意,左侧显示 `WriteLine` 方法已选中,右侧显示解释该方法的主文档。
从顶部看,我们看到名称 `Console.WriteLine`,接下来我们看到命名空间(库或盒子)是 System。接下来我们看到的是程序集:_System.Console.dll_。这是我们安装的 .NET Core SDK 的实际文件。它是一个特殊文件,其中包含我们在程序中调用的函数(方法)。DLL 代表动态链接库。这是一种花哨的说法,意思是您可以根据需要(动态地)将此特殊库链接到您的程序中,以便拥有 Microsoft 开发者为您创建的功能。
最后,在重载部分(这意味着有多种调用 `WriteLine` 方法的方式)下,我们看到第二个选项 `WriteLine(String)` 和一个定义(灰色高亮显示)。
这是我们正在使用的 `WriteLine()` 方法的形式。我们向它传递一个 `String`(一个或多个用双引号括起来的字符表示 `String` 类型)。
当我们向它传递一个 `String` 时,它会将其写入标准输出流(终端)。
我们将在本书中深入探讨更多细节。目前,这是对第一个基本程序中发生的事情的一个良好而扎实的理解。
摘要
这是对编程世界和 Linux 世界的一些漫长介绍。你已经学到了很多,并且现在了解了
- 如何使用 Visual Studio Code
- 如何在 Linux 文件系统中移动
- 如何创建目录
- 如何使用 dotnet 命令创建、构建和运行项目
- 一个简单的控制台应用程序的作用及其工作原理基础知识
历史
- 2020 年 8 月 13 日:首次发表