开始使用适用于 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 -- 没错,在红帽企业 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 是一种癌症,它在知识产权意义上依附于它接触的一切。”——史蒂夫·鲍尔默。

Micro$oft 试图伸出他们肮脏的手,因为他们无法击败 Linux,所以,他们尝试使用特洛伊木马方法。而红帽的当权者却上当了,完全被迷惑了。

这家伙和他的方法对开源来说是危险的。他说“习惯它,它即将到来。” 他说的是对的,但 Micro$oft 不是您的朋友或盟友。当为时已晚时,他们会背后捅 Linux 一刀,所谓的开源运动将不复存在。最好的防御正是他们正在做的,这不好。但他们情不自禁,他们想拥有世界,可怕的是……他们会的。

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

仅此而已。

回复 作者 total_loss26

提防 Micro$oft!

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

理解

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

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

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