开始使用适用于 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 发行版列表包括红帽企业 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 是一位见多识广的开发人员,是微软 MVP,目前是红帽的开发者体验总监,专注于 Linux 上的 Microsoft .NET。他的使命是将 .NET 开发人员与 Linux 和开源社区联系起来。在加入红帽之前,Don 曾在 Rackspace 担任开发者倡导者,专注于云技术。

11 条评论

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

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

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

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

Drew -- 确实,让 MS SQL Server 在红帽企业 Linux (RHEL) 上运行是一个巨大的优势。当您添加 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,所以,他们尝试了特洛伊木马方法。而红帽的当权者完全上当了。

这家伙和他的方法对开源很危险。他说“习惯它吧,它即将到来。”他是对的,但微软不是你的朋友,也不是你的盟友。当为时已晚时,他们会从背后捅 Linux 一刀,所谓的开源运动将不复存在。最好的防御正是他们正在做的事情,这绝不是好事。但他们身不由己,他们想拥有全世界,可怕的是……他们会的。

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

仅此而已。

回复 作者 total_loss26

提防微软!

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

理解

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

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

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