在 WSL Ubuntu 上使用 .NET 进行跨平台开发新手入门

翻译自 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 同时测试它们。


相关链接:

  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/ ↩︎

作者 :haydenb  

译者 :技术译民  
出品 :技术译站(https://ITTranslator.cn/)

END

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/306100.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

明源云·天际,地产⾏业的Salesforce Lightning Platform

源宝导读&#xff1a;2020年11月6日&#xff0c;明源云在CIO峰会上正式对外发布了“天际开放平台”&#xff0c;这是明源云凝聚其20多年行业经验打造的一款企业级PaaS平台。本文将介绍我们对企业级PaaS平台的行业思考&#xff0c;以及为加速泛地产生态链数字化转型而做的技术创…

c程序设计语言选修难吗,欢迎大家选修C语言程序设计这门课,本帖解释一下一些常见的问题...

置顶欢迎大家选修C语言程序设计这门课&#xff0c;本帖解释一下一些常见的问题叶卡林娜发表于2017年01月05日首先欢迎大家选修浙大翁恺老师的C语言程序设计课程。开课2天就看到讨论区已经有这么多帖子&#xff0c;说明同学们的学习热情很高。结合前几次开课的经验以及目前在讨论…

IdentityServer4系列 | 支持数据持久化

一、前言在前面的篇章介绍中&#xff0c;一些基础配置如API资源、客户端资源等数据以及使用过程中发放的令牌等操作数据&#xff0c;我们都是通过将操作数据和配置数据存储在内存中进行实现的&#xff0c;而在实际开发生产中&#xff0c;我们需要考虑如何处理数据持久化呢&…

c语言修仙受控可看吗,强推三本神奇到爆的小说,c语言修仙,程序员与修真会擦出什么火花...

大家好&#xff0c;我是小龙。今天我给大家推荐三本神奇到爆的小说&#xff0c;c语言修仙&#xff0c;程序员与修真会擦出什么火花!一《c语言修仙》【一十四洲】【简介】: 林浔是一个程序员&#xff0c;通宵编代码后发现自己身体内多了一个程序输入窗口。他尝试编了一个循环程序…

【Vue】Vue与ASP.NET Core WebAPI的集成

SPA单页面应用已经遍地开花&#xff0c;熟知的三大框架&#xff0c;Angular、Vue和React&#xff0c;其中Angular与React均可集成至ASP.NET Core&#xff0c;且提供了相关了中间件。但是Vue没有:“As far as I’m aware, we don’t have plans to introduce Vue-specific featu…

引入Jaeger——封装

随着微服务的普及&#xff0c;微服务间的调用全链路跟踪也火了起来&#xff0c;Jaeger(https://www.jaegertracing.io/)是CNCF孵化的全链路跟踪型项目&#xff0c;在.net core中&#xff0c;提供了一个Jaeger的Nuget(https://github.com/jaegertracing/jaeger-client-csharp)包…

临近年关,发生两起磁盘占满引发的服务下线故障

一口气说两个因为磁盘空间不足引发的应用故障。作为拿起键盘一把梭的Coder&#xff0c; 开发--->部署-->收工--->心旷神怡&#xff0c;滋一口82年的可乐.过了几个月&#xff0c;服务突然下线了&#xff01;CTO又有杀程序员祭天的理由了!事故1&#xff1a;Azure App Se…

c语言幼儿园积木游戏,幼儿园《积木游戏》课件【三篇】

【导语】课件制作本身就是作者综合素养的一种体现&#xff0c;它显现出制作者对教育、教学、教材改革方向的把握&#xff0c;对课堂教学的理解&#xff0c;对现代教育技术的领悟。因此教师在设计课件时一定要吃透教学内容&#xff0c;设计出符合教学的方案用于课件。下面是无忧…

蚂蚁调度AntJob-分布式任务调度系统

分布式任务调度系统&#xff0c;纯NET打造的重量级大数据实时计算平台&#xff0c;万亿级调度经验积累&#xff01;面向中小企业大数据分析场景。开源地址&#xff1a;https://github.com/NewLifeX/AntJob使用教程&#xff1a;https://www.yuque.com/smartstone/blood/antjob体…

c语言怎么让图形界面单独显示,「分享」C语言如何编写图形界面

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼贴吧内经常有人问C语言是不是只能用于字符终端界面开发&#xff0c;不能用于图形界面。大家也都有回答&#xff0c;需要其他的库。MFC&#xff0c;GTK&#xff0c;QT。本人近期刚用GTK库加上纯C写成了第一个LINUX实用程序。现在与大…

如何在 ASP.NET Core 中 自定义中间件

ASP.NET Core 是一个跨平台&#xff0c;开源的&#xff0c;轻量级&#xff0c;高性能 并且高度模块化的web框架&#xff0c;同时扩展性也是非常强&#xff0c;你可以在 request -> response 请求管道中安插各种中间件来根据自己的场景定制化&#xff0c;比如说&#xff1a;监…

ASP.NET Core Authentication and Authorization

最近把一个Asp .net core 2.0的项目迁移到Asp .net core 3.1&#xff0c;项目启动的时候直接报错:InvalidOperationException: Endpoint CoreAuthorization.Controllers.HomeController.Index (CoreAuthorization) contains authorization metadata, but a middleware was not …

android dialog 自定义布局,如何设置AlertDialog的自定义布局?

调用我的对话框:alertDialog showInfoDialog(message "$wrongPasscodeMessage\n$retryMessage")方法如下:fun FragmentActivity.showInfoDialog(message: String?): AlertDialog? {return try {val customLayout layoutInflater.inflate(R.layout.custom_layout…

android 打开谷歌导航,国内开启google位置记录功能/android版google maps 7+上,恢复位置记录功能在国内使用(需root)...

android版google 地图在 7以后的版本上&#xff0c;位置记录功能在国内不能用了&#xff0c;提示本功能不能在中国使用。至少对本人&#xff0c;“位置记录”功能是非常有用的功能&#xff0c;尤其是骑车出行时记录自己的路线。目前还没找到替代产品。之前一段时间内恢复回旧版…

程序员过关斩将--少年派登录安全的奇幻遐想

“据说&#xff0c;这篇也是快餐&#xff0c;完全符合年轻人口味说到登录&#xff0c;无人不知无人不晓。每一个有用户体系的相关系统都会有登录的入口&#xff0c;登录是为了确认操作人的正确性。说到登录安全&#xff0c;其实是一个很伟大的命题&#xff0c;不过常用的手段也…

C# 9 新特性 —— 增强的 foreach

C# 9 新特性 —— 增强的 foreachIntro在 C# 9 中增强了 foreach 的使用&#xff0c;使得一切对象都有 foreach 的可能我们来看一段代码&#xff0c;这里我们试图遍历一个 int 类型的值思考一下&#xff0c;我们可以怎么做使得上面的代码编译通过呢&#xff1f;迭代器模式迭代器…

android系统休眠发广播,Android - BroadcastReceiver

BroadcastReceiverBroadcastReceiver&#xff0c;广播接收者&#xff0c;用来接收系统和应用的广播&#xff0c;并做出相应的处理&#xff0c;如电量过低时提示用户充电等&#xff1b;BroadcastReceiver 是 Android 的四大组件之一&#xff0c;分为 普通广播、有序广播、粘性广…

开源·共享·创新|2020年中国.NET开发者大会圆满收官!

“疫情无限续费”的2020年&#xff0c;对于14亿中国人而言&#xff0c;是必须习惯口罩长在来脸上的一年&#xff1b;是各种线下聚会&#xff0c;被迫数次延期、滞后、云上举办的一年&#xff1b;……而对于潜心修行&#xff0c;静蓄能量的中国.NET开发者而言&#xff0c;2020绝…

android+百度lbs云,百度——LBS.云 v2.0——云存储扩展字段——Android

今天要解决两个问题&#xff1a;1云存储扩展字段2上传的数据是乱码3android版本上传数据到云端使用了一段时间LBS云功能之后&#xff0c;随着对系统的熟悉&#xff0c;默认提供的字段&#xff0c;肯定无法满足需要。比如增加注释&#xff0c;价格&#xff0c;档次等字段的时候。…

年终将至,回顾我们一起走过的 2020

又到了年终末尾匆匆忙忙的 2020 似乎按下了倍速键一晃眼我们就从夏天走到了冬天在这不平凡的一年中我们同途共进也笑着成长让我们跟随着六大年度词条重温这一年我们共同经历的值得骄傲的瞬间吧&#xff01;点击文内高亮部分&#xff0c;阅读文章了解更多人才“倍”出星桥计划出…