如何使用 .NET Core 构建跨平台控制台应用程序

现在你可以编写一次 C#/.NET 代码,在任何平台上,并在 Windows、Linux 和 macOS 上运行它。
524 位读者喜欢这篇文章。
How to build cross-platform console apps with .NET Core

Opensource.com。CC BY-SA 4.0

虽然 .NET 传统上是一个仅限 Windows 的闭源专有平台,但这些日子即将结束。新的 .NET Core 平台已经到来,它是开源跨平台的。现在你可以编写一次 C#/.NET 代码,在任何平台上,并在 Windows、Linux 和 macOS 上运行它。

这个新的 .NET 平台正在 GitHub 上以开放方式构建,主要使用 MIT 和 Apache 许可证,甚至接受社区贡献。这个新平台从头开始围绕之前开源的 Roslyn compiler (.NET 编译器平台) 构建,并且被设计为不与 Windows 或 Visual Studio 绑定,允许开发人员在任何系统中的任何 IDE 中工作,并在任何服务器或平台上运行他们的应用程序。

为了演示这个新平台,让我们构建一个超级简单的控制台应用程序,我们可以使用新的 dotnet 命令行界面 (CLI) 在 Windows 和 Linux 上运行它。要开始使用,你需要安装 .NET Core(其中包含 dotnet CLI 工具)。Microsoft 为大多数平台(包括各种 各种 发行版)在其 在线文档 中提供了完整的文档。

如果你不想在本地安装 .NET Core,microsoft/dotnet:latest Docker 镜像预装了所有最新的工具和 SDK。

1. 创建我们的新应用

.NET Core 正在快速变化。这些说明适用于撰写本文时的最新版本。

首先,我们可以使用 dotnet new console 创建一个新的控制台应用程序。这将自动创建一个 Program.cs 和一个以当前目录命名的 .csproj(我的目录是 app.csproj)。

dotnet new

为了证明它有效,请尝试运行 dotnet restore,这将恢复运行你的应用程序所需的任何包。完成之后,运行 dotnet run,你应该会在控制台中看到非常重要的 Hello, World!

dotnet restore run

2. 向我们的应用添加逻辑

在您最喜欢的文本编辑器中打开 Program.cs,并将读取 Console.WriteLine("Hello World!"); 的行替换为下面的行。因为 .NET Core 没有与 Visual Studio 耦合,所以你可以使用任何你喜欢的 IDE 或文本编辑器,甚至是 vi

Console.WriteLine($"Hello {System.Environment.GetEnvironmentVariable("USER")}! I'm {System.Environment.MachineName} and I'm talking to you from {System.IO.Directory.GetCurrentDirectory()}");

对于那些不熟悉 C# 和 .NET 的人来说,这段代码本质上是打印一个更详细版本的经典 Hello, World 应用程序,现在使用来自当前环境的信息。请注意,这里也没有特定于平台的代码。

3. 运行你的新应用

如果你现在运行 dotnet build,你将获得你的 .dll 和其他文件添加到你的 ./bin/Debug 文件夹中。你已经编写了一个跨平台控制台应用程序。将这些文件复制到另一台运行 .NET Core 的机器上——甚至是 Linux 或 OS X 机器——并运行 dotnet ./path/to/your/app.dll,你应该会看到与之前相同的输出;但是,你仍然使用本地 .NET 运行时来执行此操作。幸运的是,.NET Core 包含构建和发布独立包中的本机二进制文件的能力,以便你的目标系统(或用户)甚至不需要安装 .NET 即可运行你的应用程序。

4. 为其他平台做准备

为了为跨平台应用程序做准备,我们必须告诉 .NET Core SDK 要为哪些平台构建。因为此过程涉及本机库,所以我们必须具体说明不仅是哪个平台,还要说明具体的风格和版本。

从应用程序目录打开你的 .csproj 文件,并在
标签之间的某个位置添加以下 XML 标签

<PropertyGroup>
    <RuntimeIdentifiers>win10-x64;osx.10.12-x64;debian.8-x64</RuntimeIdentifiers>
</PropertyGroup>

这告诉 .NET 我们想要为 Windows 10 64 位、macOS Sierra Debian 8 构建一个自包含版本的应用程序。现在你需要做的就是为你之前选择的每个运行时运行 dotnet publish,以便为每个平台编译本机二进制文件

dotnet publish screenshot

查看 ./app/bin/Debug/netcoreapp1.1/ 文件夹,那里将有一个针对我们每个平台的目录,每个目录都有一个 publish 文件夹。在该文件夹中不仅包含你的应用程序的本机版本副本,还包含运行所需的所有 .NET 库,因此你无需在目标系统上安装 .NET。只需将文件复制到干净的机器上,并为你所在的平台运行可执行文件即可。

file output screenshot

run output

结论

使用 C# 和新的 .NET Core 平台,你可以在任何平台上构建应用程序,并将其发布到任何平台——100% 代码重用,完全原生,无需运行时或框架安装。你可以在 GitHub 上看到为这项技术提供支持的新框架(运行时源代码也在 GitHub 上)。对于 C# 和整个 .NET 平台来说,这是一个激动人心的时代。

标签
Alistair Chapman
Alistair Chapman 是一位信息安全工程师、.NET 开发人员和技术架构师。虽然他目前在 Red Hat 工作,但他还做过从网络工程到 DevOps 转型的一切工作。工作之余,Alistair 活跃于 .NET 开源社区,包括维护 Cake(一个 .NET 基金会项目)。所有观点仅代表我个人,不代表 Red Hat。

4 条评论

使用 root 用户创建 Windows 应用程序?

好吧,你没能说服我。

root 用户只是 Microsoft 的 `dotnet` Docker 镜像的默认用户。显然,应用程序将以你用来启动它的任何用户身份运行,包括非 root 用户。正如你在 Windows 屏幕截图中所看到的,你不需要成为 root 用户。

主要目标只是为了证明你现在可以在任何平台上(包括 Docker!)运行 .NET 应用程序!

回复 ,作者 isnotmenow (未验证)

这篇文章的问题在于它没有回答“为什么”你要为此目的使用 .NET。更合乎逻辑的选择显然是 Go,它具有原生编译的优势,运行时复杂性和开销远低于将 .NET 移植到其他环境所需的内容。充其量,人们可能会将 C#/.NET 与 Java(或者有一天与 Swift)进行比较和对比,但是一旦你针对此特定目的查看像 Go 这样的东西,C#/.NET、Java,甚至在 Swift 到来之前的 Swift,对于作者提出的目的而言,似乎都是不相关、无效和过时的最坏选择。Go 并不能很好地解决所有问题,但它特别擅长解决这个问题。

我实际上是 Go 的忠实粉丝,并且赞赏它的原生编译方法!我也坚信选择,并认为开发人员现在在跨平台领域有更多选择是很棒的。

虽然我同意 Go 在跨平台方面有一个很棒的解决方案,但 Go 和 .NET 是非常不同的语言、平台和生态系统。例如,C# 是一种功能非常全面的语言,具有泛型、异常、原生异步支持、重载和可空类型;Go 没有这些(据我所知)。

同样,NuGet 包生态系统是 .NET 平台的重要组成部分,而 Go(作为一种惯例)倾向于尽可能避免依赖项,并且当然没有像 .NET Core 那样内置对包管理的支持。

相反,使用低级原语(如指针)、一些异步构造(使用 goroutine)和接口实现(因为它是环境的)在 Go 中开发比 .NET 更容易。

我当然不想暗示 .NET 是适用于每种开发人员或每种用例的正确解决方案,但我想证明开发人员在进行独立的跨平台开发时现在有额外的选择。

.NET Core 可能有很多不足之处,但它肯定不是“不相关、无效和过时的”,它只是不适用于每种用例的正确解决方案。

希望这有帮助!

回复 ,作者 David Sugar (未验证)

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 许可。
© . All rights reserved.