开始使用适用于 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

警惕 Micro$oft!

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

理解

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

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

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