Linux 版 .NET 入门

微软决定将 .NET Core 开源,这意味着 Linux 开发者应该开始熟悉并尝试它了。
749 位读者喜欢这篇文章。
people on top of a connected globe

Pixabay

当您了解软件开发者偏好的操作系统时,您通常可以猜到他们使用的编程语言。如果他们使用 Windows,语言列表包括 C#、JavaScript 和 TypeScript。一些老牌开发者可能正在使用 Visual Basic,而前沿的编码人员则在涉足 F#。即使您可以使用 Windows 开发几乎任何语言,但大多数人还是坚持使用常用的语言。

如果他们使用 Linux,您会得到一个开源项目列表:Go、Python、Ruby、Rails、Grails、Node.js、Haskell、Elixir 等。似乎每当引入一种新语言(Kotlin,有人用吗?),Linux 就会吸引一批新的开发者。

因此,微软(微软?!)通过将 .NET 框架(称为 .NET Core)开源并使其可在任何平台上运行,从而打破了这一理论。Windows、Linux、MacOS,甚至电视操作系统:三星的 Tizen。加上微软的其他 .NET 版本,包括 Xamarin,您可以将 iOS 和 Android 操作系统添加到列表中。(真的吗?我可以用 Visual Basic 编写一个在我的电视上运行的应用程序?这是什么怪事?)

鉴于这种情况,现在是 Linux 开发者熟悉 .NET Core 并开始试验的时候了,甚至可以构建生产应用程序。很快您就会遇到这样的人:“我使用 Linux ... 我编写 C# 应用程序。” 做好准备:.NET 来了。

如何在 Linux 上安装 .NET Core

您可以运行 .NET Core 的 Linux 发行版列表包括 Red Hat Enterprise Linux (RHEL)、Ubuntu、Debian、Fedora、CentOS、Oracle 和 SUSE。

每个发行版都有自己的安装说明。例如,考虑 Fedora 26

步骤 1:添加 dotnet 产品源。

	sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc
	sudo sh -c 'echo -e "[packages-microsoft-com-prod]\nname=packages-microsoft-com-prod \nbaseurl=https://packages.microsoft.com/yumrepos/microsoft-rhel7.3-prod\nenabled=1\ngpgcheck=1\ngpgkey=https://packages.microsoft.com/keys/microsoft.asc" > /etc/yum.repos.d/dotnetdev.repo'

步骤 2:安装 .NET Core SDK。

	sudo dnf update
	sudo dnf install libunwind libicu compat-openssl10
	sudo dnf install dotnet-sdk-2.0.0

创建 Hello World 控制台应用程序

现在您已经安装了 .NET Core,您可以创建无处不在的“Hello World”控制台应用程序,然后再了解有关 .NET Core 的更多信息。毕竟,您是开发者:您想现在创建并运行一些代码。好吧;这很容易。创建一个目录,移动到其中,创建代码并运行它

mkdir helloworld && cd helloworld
dotnet new console
dotnet run

您将看到以下输出

$ dotnet run
Hello World!

刚刚发生了什么?

让我们分解一下刚刚发生的事情。我们知道 mkdircd 做了什么,但是在那之后呢?

dotnet new console

正如您无疑已经猜到的那样,这创建了“Hello World!”控制台应用程序。需要注意的关键事项是:项目名称与目录名称匹配(即“helloworld”);代码是使用模板(控制台应用程序)构建的;并且项目的依赖项已通过 dotnet restore 命令自动检索,该命令从 nuget.org 中拉取。

如果您查看目录,您将看到创建了这些文件

Program.cs
helloworld.csproj

Program.cs 是 C# 控制台应用程序代码。继续看看里面(您已经看过了......我知道......因为您是开发者),您会看到发生了什么。一切都很简单。

Helloworld.csproj 是 MSBuild 兼容的项目文件。在这种情况下,它没有太多内容。当您创建 Web 服务或网站时,项目文件将具有新的重要性。

dotnet run

此命令做了两件事:它构建了代码,并运行了新构建的代码。每当您调用 dotnet run 时,它都会检查 *.csproj 文件是否已被更改,并将运行 dotnet restore 命令。它还将检查是否已更改任何源代码,并将在后台运行 dotnet build 命令,该命令(您猜对了)构建可执行文件。最后,它将运行可执行文件。

某种程度上是这样。

我的可执行文件在哪里?

哦,就在那里。只需运行 which dotnet,您就会看到(在 RHEL 上): 

/opt/rh/rh-dotnet20/root/usr/bin/dotnet

那是您的可执行文件。

某种程度上是这样。

当您创建 dotnet 应用程序时,您正在创建一个程序集……一个库……是的,您正在创建一个 DLL。如果您想查看 dotnet build 命令创建的内容,请查看 bin/Debug/netcoreapp2.0/。您将看到 helloworld.dll、一些 JSON 配置文件和一个 helloworld.pdb(调试数据库)文件。您可以查看 JSON 文件以了解它们的作用(您已经看过了......我知道......因为您是开发者)。

当您运行 dotnet run 时,运行的进程是 dotnet。该进程反过来调用您的 DLL 文件,它就变成了您的应用程序。

它是可移植的

这是 .NET Core 真正开始偏离仅限 Windows 的 .NET Framework 的地方:您刚刚创建的 DLL 将在任何安装了 .NET Core 的系统上运行,无论是 Linux、Windows 还是 MacOS。它是可移植的。实际上,它字面上被称为“可移植应用程序”。

永远的单机版

如果您想分发应用程序,并且不想要求用户在其机器上安装 .NET Core 怎么办?(这样要求有点粗鲁,对吧?)同样,.NET Core 也有答案:独立应用程序。

创建独立应用程序意味着您可以将应用程序分发到任何系统,它都可以运行,而无需安装 .NET Core。这意味着更快更轻松的安装。这也意味着您可以在同一系统上运行多个不同版本的 .NET Core 的应用程序。看起来它对于在 Linux 容器内运行微服务也很有用。嗯……

有什么陷阱?

好吧,现在有一个陷阱。当您使用 dotnet publish 命令创建独立应用程序时,您的 DLL 会与运行您的 DLL 所需的所有 .NET 位一起放入目标目录中。也就是说,您可能会在目录中看到 50 个文件。这种情况很快就会改变。一项已经在实验室中运行的计划 .NET Native 将在未来版本的 .NET Core 中引入。这将构建一个包含所有位的可执行文件。就像您在 Go 语言中编译时一样,您指定目标平台,然后得到一个可执行文件;.NET 也会这样做。

您确实需要为每个目标构建一次,这才是合理的。您只需包含一个 运行时标识符 并构建代码,例如此示例,该示例为 64 位处理器上的 RHEL 7.x 构建发布版本

dotnet publish -c Release -r rhel.7-x64

Web 服务、网站等等

.NET Core 模板中包含更多内容,包括对 F# 和 Visual Basic 的支持。要获取 .NET Core 中内置的可用模板的起始列表,请使用命令 dotnet new --help

提示:.NET Core 模板可以由第三方创建。要了解其中一些第三方模板,请查看 这些模板,然后让您的思绪开始驰骋……

与大多数命令行实用程序一样,上下文帮助始终可以通过使用 --help 命令开关获得。现在您已经了解了 Linux 上的 .NET Core,帮助功能和良好的网络搜索引擎是您开始入门所需的一切。

其他资源

准备好了解更多关于 Linux 上的 .NET Core 的信息了吗?查看以下资源

User profile image.
作为一位见多识广的开发者,Don 是 Microsoft MVP,目前是 Red Hat 的开发者体验总监,专注于 Linux 上的 Microsoft .NET。他的使命是将 .NET 开发者与 Linux 和开源社区联系起来。在加入 Red Hat 之前,Don 曾在 Rackspace 担任开发者布道师,沉浸于云技术之中。

11 条评论

感谢您撰写关于在 Linux 上开发 .Net 应用程序的非常详细的文章。虽然 .Net Core 已经发布一年多了,但采用率仍然很低。我认为需要指导当前一代开发者使用 C# 为 .Net core 运行时构建一些开源应用程序,以提高采用率。需要探索 .Net Native。您能对这项新计划进行一些阐述吗?

很棒的介绍。这是令人兴奋的消息,我不知道它的可移植性。

在工作中,我们的 Intranet 是 ASP.NET,但我们的外部站点是 Linux,因此如果这可以帮助整合不同的操作系统,那就太好了。结合 Linux 上的 MS SQL Server,我们对 Microsoft Windows 的依赖性将进一步降低。

我很想看到更多关于在 Linux(甚至 Windows 和 Visual Studio)上设置 .NET 开发工作流程以及部署到运行 Linux 的服务器的信息。

Drew -- 实际上,在 Red Hat Enterprise Linux (RHEL) 上运行 MS SQL Server 是一个巨大的优势。当您添加 Linux 容器和 Kubernetes 时,它很快就变成了 .NET 开发者的梦想:快速、可移植、容器、微服务……所有好东西。

我在 RedHatLoves.net(我的 URL)上有一些东西;您关于 Linux + Windows 上的 .NET 以及部署到 Linux 服务器的要求是我“一直想做”的事情 - 也就是说,一篇博客文章和视频。

我看看我是否可以在下周的假期中抽出一些时间并将其整理出来。谢谢您的“推动”。

回复 作者 dragonbite

.Net Core 和 Mono 之间的关系或区别是什么?

经常被问到这个问题。

Mono 是早期社区主导的*成功*尝试将 .NET Framework 移植到 Linux。Xamarin 基于 Mono(现在仍然是),因此当微软收购 Xamarin 时,Mono 也随之而来。

坦率地说,.NET Core 速度更快,因为它是一个新项目,开发者能够从以前的尝试(即 .NET Framework)中吸取经验教训。

简而言之,Mono <> Core。

注意,但是:.NET Standard 2.0 在这里非常重要。

.NET Standard 2.0 不是框架,而是一个_规范_。.NET Core 2.0、.NET Framework 和 Mono 都**在一定程度上**遵守 .NET Standard 2.0。.NET Standard 2.0 中描述的 API 将在所有 .NET 选择中起作用:Core、Framework 和 Mono。

换句话说;如果您按照 .NET Standard 2.0 中的规范编写代码,您就知道它将在任何地方运行。很酷,对吧?

有一个很棒的工具可以检查您现有的库,以了解它们与所有 .NET 版本的兼容性评级。它被称为 APIPort,可以在这里找到

https://github.com/Microsoft/dotnet-apiport

希望这有帮助。

我还*强烈*建议查看 URL RedHatLoves.net 和 live.asp.net。

-- Don

回复 作者 emiliosic

我不知道这个人是谁,但我会告诉任何理智的开发者,不要听他的。“Linux 就像癌症一样,在知识产权方面附着在它接触到的一切事物上。” ——史蒂夫·鲍尔默。

微软试图伸出他们肮脏的手,因为他们无法击败 Linux,所以,他们尝试了特洛伊木马策略。而 RedHat 的当权者却上当了,完全上当了。

这个人,以及他的方法,对开源是危险的。他说“习惯它吧,它要来了。” 他是对的,但微软不是你的朋友,也不是你的盟友。当为时已晚时,他们会背刺 Linux,所谓的开源运动将不复存在。最好的防御正是他们正在做的,这不好。但他们也无能为力,他们想拥有整个世界,可怕的是……他们会成功的。

史蒂夫·鲍尔默已经不再有影响力,并且 .NET Core 已获得 MIT 许可。

仅此而已。

回复 作者 total_loss26

提防微软!

我不得不不同意这篇文章。.NET 不是开源和 Linux/Unix 用户需要“习惯”的强制性功能,因为“它要来了”

理解

开源社区存在这么长时间是因为他们不靠微软的施舍过活。我们不必“遵守”他们的任何规则,因为我们创建并遵守我们自己的规则。“微软热爱 Linux”的座右铭并没有愚弄顽固的开源开发者和支持者,也永远不会渗透到整个 FOSS 领域,因为有些人实际上更喜欢 Windows-Free 的生活方式。这不是粉丝或迷妹的事情……对于这些人来说,开源只是更适合他们的需求……他们的业务……他们的个人计算生活方式,他们看不到任何理由用微软令人困惑且(通常)充满许可问题的世界来搞乱它。这就是为什么开源社区如此充满活力,如此丰富。我们遍布从加利福尼亚到克利夫兰,从波士顿到博茨瓦纳……从旧金山到瑞典……从芝加哥到中国……我们已经“走向全球”,这让微软(和苹果!)感到不安,因为他们无力阻止我们。他们尝试了一切……从锁定他们的内核,到在周期中更改驱动程序,到创建 UEFI,以及他们所有的尝试都失败了。现在我为什么要放弃 C++...Python...Java 等等...去学习 .NET?这会给我和我的所有开源项目带来什么价值?不……谢谢。这可能会吸引一些在 FOSS 世界中待的时间不长的人,因此……他们不知道曾经的挣扎……曾经的战斗,但对于老兵?……对于老兵的孩子们?……他们会认出恶作剧行为,并且不想与它有任何瓜葛!这只是我看待事物的方式……

第一次接触到这个概念,了解到 .net 应用程序可以在 linux 平台上运行。感谢您分享非常有用的信息。

知识共享许可协议本作品根据知识共享署名-相同方式共享 4.0 国际许可协议获得许可。
© . All rights reserved.