如何使用 .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 编译器(.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,您将获得添加到 ./bin/Debug 文件夹中的 .dll 和其他文件。您已经编写了一个跨平台控制台应用程序。将这些文件复制到另一台运行 .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 用户。

主要目标只是为了演示您现在可以在任何平台上运行 .NET 应用程序,包括 Docker!

回复 ,作者:isnotmenow (未验证)

这篇文章的问题在于它没有回答“为什么”您要为此目的使用 .NET。更合乎逻辑的选择显然是 Go,它具有本机编译的优势,运行时复杂性或开销远低于将 .NET 移植到其他环境所需的内容。充其量,人们可能会将 C#/.NET 与 Java(或者有一天与 Swift)进行比较和对比,但是一旦您为此特定目的查看像 Go 这样的东西,像 C#/.NET、Java,甚至 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.