翻译自 haydenb 2020年6月3日的文章《Getting started with cross-platform development using .NET on Ubuntu on WSL》 [1]

.NET 是一个开源软件框架,用于在 Linux、Windows 和 macOS 上构建跨平台应用程序。WSL 上的 Ubuntu [2]允许您同时为 Ubuntu 和 Windows 构建和测试应用程序。当我们把这些融合在一起时会发生什么呢?这篇博客将演示如何在 WSL 上安装 .NET 开发栈,并构建一个简单的操作系统感知应用,然后在 Linux 和 Windows 上测试它。

启用 WSL 1

以管理员方式启动 PowerShell 并运行:

Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux

如果您只想安装 WSL 1,您可以重启电脑并跳过下一步。

Restart-Computer

如果您要安装 WSL 2,请不要重启,继续下一步操作:

启用 WSL 2 (Windows 10 2004+)

想要了解更多关于 Ubuntu on WSL 2 的细节,请查看 “Ubuntu on WSL 2 Is Generally Available[3]

以管理员方式启动 PowerShell 并运行:

dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

然后重启 Windows 操作系统:

Restart-Computer

在 WSL 上安装 Ubuntu

从 Microsoft Store 中下载 Ubuntu:

Ubuntu 20.04 LTS on the Microsoft Store [4]

想要了解更多在 WSL 上安装 Ubuntu 的方法,请查看 Ubuntu on WSL wiki 页面 [5]

安装 Windows Terminal

从 Microsoft Store 中下载 Windows Terminal:

Windows Terminal on the Microsoft Store [6]

也可以从 GitHub 下载 Windows Terminal。

运行 WSL 上的 Ubuntu

打开 Windows Terminal 并运行:

ubuntu.exe

当您首次在 WSL 上运行 Ubuntu 时,它将安装,并提示您创建一个 Linux 用户,这个用户是独立于 Windows 用户的。

退出并重新打开 Windows Terminal,您将会发现 Ubuntu 出现在下拉菜单中:

您可以在 settings.json 中设置 Windows Terminal,将 Ubuntu 设置为默认项。

更新 WSL 上的 Ubuntu

您应该定期检查更新,并在 WSL 上的 Ubuntu 中运行升级。我们用 apt (Ubuntu 包管理器)来实现。

要检查更新,请运行:

sudo apt update

要获得升级,请运行:

sudo apt upgrade

您可以通过用 && 将它们连接在同一行并添加 -y 标签,自动更新并应用可用的升级:

sudo apt update && sudo apt upgrade -y

添加微软的 .NET 资源库和签名密钥

我们需要为 apt 添加微软的 .NET 资源库和签名密钥。我们将从微软下载并安装一个包来完成这项工作。

请确保您正在为您的 Ubuntu 版本安装正确的资源库。您可以使用下面的命令检查 Ubuntu 的当前版本:

cat /etc/os-release

下面的示例使用 Ubuntu 20.04,来自 Canonical 的最新 LTS 发行版。如果您仍在使用 Ubuntu 16.04、18.04 或 19.10,您可以在微软文档 [7]中找到相应的资源库。想要了解更多关于 LTS 和中间版本之间的区别,我们有一个发布周期页面 [8]

为 20.04 版本下载微软的资源库和密钥包:

wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb

使用 dpkg -i 手动安装微软资源包:

sudo dpkg -i packages-microsoft-prod.deb

现在当你更新 apt 时,你会看到微软资源库已检查升级了:

安装 .NET SDK

使用 apt 从微软资源库安装 .NET 和相关依赖项:

sudo apt-get install dotnet-sdk-3.1 -y

新建工作区

创建一个新的工作目录并打开该目录:

mkdir dotnetproject
cd dotnetproject/

新建一个 .NET 项目

使用 dotnet new 创建一个新的 .NET 控制台项目,这会创建一个名为 Program.cs 的文件和其他一些必要的文件夹和文件:

dotnet new console

探索我们的 .NET 应用

列出您的新 .NET 项目中的文件:

ls

查看 Program.cs 的内容:

cat Program.cs

运行示例程序:

dotnet run

自定义我们的 .NET 应用

在您最喜欢的编辑器中打开 Program.cs:vi、nano、emacs 或者有 remote WSL 扩展的 VS Code

在这里,我们使用 WSL 上的 Ubuntu 中包含的 nano:

nano Program.cs

首先,我们添加 Interop services 命名空间

using System.Runtime.InteropServices;

然后把:

Console.WriteLine("Hello World!");

替换成:

Console.WriteLine($"Hello {System.Environment.GetEnvironmentVariable("USER")}");

if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
{
Console.WriteLine("We're on Linux!");
} if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
Console.WriteLine("We're on Windows!");
} Console.WriteLine("Version {0}", Environment.OSVersion.Version);

这段代码也可以在这里 [9]找到。

这个应用程序告诉我们:当前的用户,检查是在 Windows 还是 Linux 上,然后给出 OS 内核版本。

退出并保存,然后运行:

dotnet run

让我们的 .NET 应用程序跨平台

我们需要更新 .NET 项目文件 dotnetproject.csproj,告诉 .NET 同时为 Linux 和 Windows 平台构建。

在我们的编辑器中打开 dotnetproject.csproj 并添加:

<PropertyGroup>
<RuntimeIdentifiers>win10-x64;linux-x64</RuntimeIdentifiers>
</PropertyGroup>

这将引导 .NET 同时为 Windows 10 x64 和 Linux x64 构建自包含的二进制文件。

构建我们的跨平台应用程序

当我们配置好项目后,构建 .NET 应用程序变得如此简单:

dotnet publish -r win10-x64
dotnet publish -r linux-x64

可以在项目的 /bin/ 文件夹中找到每个平台的自包含二进制文件及其所有必需的库:

ls bin/Debug/netcoreapp3.1/

测试 Linux 版本

您可以直接运行 Linux 二进制文件,如下所示:

./bin/Debug/netcoreapp3.1/linux-x64/publish/dotnetproject

测试 Windows 版本

要运行 Windows 版本,请将其复制到 Windows 文件系统中:

cp -r ~/dotnetproject/bin/Debug/netcoreapp3.1/win10-x64/publish /mnt/c/Users/Hayden/OneDrive/Desktop/

译者注:

此处的 /mnt/ 为 Ubuntu 系统中看到的 Windows 文件系统的根目录,/mnt/c/ 即为 Windows 系统中的 C 盘。

然后运行:

/mnt/c/Users/Hayden/OneDrive/Desktop/publish/dotnetproject.exe

至此,我们已经为 Linux 和 Windows 构建并运行了相同的应用程序。我们可以使用 WSL 同时测试它们。

作者 : haydenb

译者 : 技术译民

出品 : 技术译站

链接 : 英文原文


  1. https://ubuntu.com/blog/creating-cross-platform-applications-with-net-on-ubuntu-on-wsl Getting started with cross-platform development using .NET on Ubuntu on WSL

  2. https://ubuntu.com/wsl Ubuntu on WSL

  3. https://ubuntu.com/blog/ubuntu-on-wsl-2-is-generally-available Ubuntu on WSL 2 Is Generally Available

  4. https://www.microsoft.com/store/productId/9N6SVWS3RX71 Ubuntu 20.04 LTS on the Microsoft Store

  5. https://wiki.ubuntu.com/WSL Ubuntu on WSL wiki

  6. https://www.microsoft.com/store/productId/9N0DX20HK701 Windows Terminal on the Microsoft Store

  7. https://docs.microsoft.com/en-us/dotnet/core/install/linux-ubuntu

  8. https://ubuntu.com/about/release-cycle

  9. https://pastebin.ubuntu.com/p/swbPxXXSKD/

在 WSL Ubuntu 上使用 .NET 进行跨平台开发新手入门的更多相关文章

  1. 《ASP.NET Core跨平台开发从入门到实战》Web API自定义格式化protobuf

    <ASP.NET Core跨平台开发从入门到实战>样章节 Web API自定义格式化protobuf. 样章 Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于 ...

  2. 一网成擒全端涵盖,在不同架构(Intel x86/Apple m1 silicon)不同开发平台(Win10/Win11/Mac/Ubuntu)上安装配置Python3.10开发环境

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_200 时光荏苒,过隙白驹,即将进入2022年,著名敏捷开发语言Python也放出了3.10最终版,本次我们来展示一下在不同的系统和 ...

  3. ffmpeg 在ubuntu上编译环境搭建和开发

    步骤如下: 1. 下载 官网永远是王道,呵呵:http://ffmpeg.org/download.html 或者 svn checkout svn://svn.mplayerhq.hu/ffmpeg ...

  4. asp.net core跨平台开发从入门到实战文摘

    第1章 .NET Core 第2章 dotnet命令 第3章 VS Code安装及介绍 第4章 VS2015开发.NET Core 第5章 ASP.NET Core 第6章 EF Core 第7章 A ...

  5. 在Ubuntu上搭建kindle gtk开发环境

    某个角度上说,kindle很类似android,同样的Linux内核,同样的Java用户层.不过kindle更注重简单.节能.稳定.Amazon一向认为,功能过多会分散人们阅读时候的注意力. Kind ...

  6. 为什么 Flutter 是跨平台开发的终极之选

    跨平台开发是当下最受欢迎.应用最广泛的框架之一.能实现跨平台开发的框架也五花八门,让人眼花缭乱.最流行的跨平台框架有 Xamarin.PhoneGap.Ionic.Titanium.Monaca.Se ...

  7. .NET跨平台:在Ubuntu上用自己编译的dnx运行ASP.NET 5示例程序

    在 Linux Ubuntu 上成功编译 dnx 之后,会在 artifacts/build/ 文件夹中生成 dnx-coreclr-linux-x64/ 与 dnx-mono/ 这2个文件夹,前者是 ...

  8. .NET跨平台:在Linux Ubuntu上编译coreclr/corefx/dnx(20150617)

    编译时间:北京2015年6月17日上午 操作系统:Ubuntu 14.04.2 LTS Mono版本:Mono JIT compiler version 4.3.0 (master/3445ac5 T ...

  9. .netcore跨平台 之 windows上编译,ubuntu上运行

    1 下载并安装netcore sdk    下载地址 https://github.com/dotnet/cli 选取合适的版本下载安装即可 打开 CMD ,输入dotnet,出现以下信息说明已安装好 ...

随机推荐

  1. Event Loop - 事件队列

    Event Loop 定义: event - 事件 loop - 循环,既然叫事件循环,那么循环的点在哪? 循环的是一个又一个的任务队列,这些任务队列由宏任务和微任务构成 两条原则 一次处理一个任务 ...

  2. 第一次UML作业

    这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzzcxy/2018SE2/ 这个作业要求在哪里 https://edu.cnblogs.com/campus/f ...

  3. fist-第九天冲刺随笔

    这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzzcxy/2018SE1 这个作业要求在哪里 https://edu.cnblogs.com/campus/fz ...

  4. 【2014广州市选day1】JZOJ2020年9月12日提高B组T2 导弹拦截

    [2014广州市选day1]JZOJ2020年9月12日提高B组T2 导弹拦截 题目 Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统 V1.0.但是这种导弹拦截系统有一个缺 ...

  5. Jmeter代理服务器录制脚本--浏览器拦截访问链接

    在 Jmeter性能测试的过程中您是否会遇到代理服务器无法打开浏览器,无法录制脚本的情况呢? 在测试过程中,我也遇到过这样的问题,希望能帮到正在找寻答案的你.... Jmeter录制脚本时,跟http ...

  6. day1(初始化项目结构)

    1.初始化项目结构  └─shiyanlou_project    │  .gitignore    │  README.en.md           # 英文    │  README.md    ...

  7. mysql索引原理以及优化

    一.常见查找算法: 1.顺序查找: 最基础的查找方法,对比每一个元素进行查找.在数据量很大的时候效率相当的慢. 数据结构:有序或者无需的队列 时间复杂度:O(n) 2.二分查找: 二分查找首先要求数组 ...

  8. mysql-installer-web-community和mysql-installer-communityl两个版本的区别

    mysql的官网上提供了两个mysql共享版本的安装,一个20M,一个373.4M.二者的区别是前者是联网安装,当安装时必须能访问互联网,后者是离线安装使用的,一般建议下载离线安装使用的版本. 学Py ...

  9. 第2章 Python编程基础知识目录

    第2.1节 简单的Python数据类型.变量赋值及输入输出 第2.2节 Python的语句 第2.3节 Python运算符大全 老猿Python,跟老猿学Python! 博客地址:https://bl ...

  10. 第10.11节 Python模块和包小结

    Python的模块就是一个独立的Python文件,Python的包是一些功能相关的Python文件放到一个目录下进行统一管理的文件管理结构,包本质上是模块,加载包就是加载包下特定的模块文件__init ...