荣医胸外小刀 發表於 2020-12-29 12:11:00

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

<blockquote>
<p>翻译自 haydenb 2020年6月3日的文章《Getting started with cross-platform development using .NET on Ubuntu on WSL》 <sup class="footnote-ref"></sup></p>
</blockquote>
<p>.NET 是一个开源软件框架,用于在 Linux、Windows 和 macOS 上构建跨平台应用程序。WSL 上的 Ubuntu <sup class="footnote-ref"></sup>允许您同时为 Ubuntu 和 Windows 构建和测试应用程序。当我们把这些融合在一起时会发生什么呢?这篇博客将演示如何在 WSL 上安装 .NET 开发栈,并构建一个简单的操作系统感知应用,然后在 Linux 和 Windows 上测试它。</p>
<h2 id="启用-wsl-1">启用 WSL 1</h2>
<p>以管理员方式启动 PowerShell 并运行:</p>
<pre><code class="language-powershell">Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
</code></pre>
<p><img src="https://img2020.cnblogs.com/blog/2074831/202012/2074831-20201227212942347-2142361345.png" alt="Enable WSL 1" loading="lazy"></p>
<p>如果您只想安装 WSL 1,您可以重启电脑并跳过下一步。</p>
<pre><code class="language-powershell">Restart-Computer
</code></pre>
<p>如果您要安装 WSL 2,请不要重启,继续下一步操作:</p>
<h2 id="启用-wsl-2-windows-10-2004">启用 WSL 2 (Windows 10 2004+)</h2>
<p>想要了解更多关于 Ubuntu on WSL 2 的细节,请查看 “Ubuntu on WSL 2 Is Generally Available” <sup class="footnote-ref"></sup>。</p>
<p>以管理员方式启动 PowerShell 并运行:</p>
<pre><code class="language-powershell">dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
</code></pre>
<p><img src="https://img2020.cnblogs.com/blog/2074831/202012/2074831-20201227213111283-2020559694.png" alt="Enable WSL 2" loading="lazy"></p>
<p>然后重启 Windows 操作系统:</p>
<pre><code class="language-powershell">Restart-Computer
</code></pre>
<h2 id="在-wsl-上安装-ubuntu">在 WSL 上安装 Ubuntu</h2>
<p>从 Microsoft Store 中下载 Ubuntu:</p>
<p>Ubuntu 20.04 LTS on the Microsoft Store <sup class="footnote-ref"></sup></p>
<p><img src="https://img2020.cnblogs.com/blog/2074831/202012/2074831-20201227213150183-680796013.png" alt="Ubuntu 20.04 LTS on the Microsoft Store" loading="lazy"></p>
<p>想要了解更多在 WSL 上安装 Ubuntu 的方法,请查看 Ubuntu on WSL wiki 页面 <sup class="footnote-ref"></sup>。</p>
<h2 id="安装-windows-terminal">安装 Windows Terminal</h2>
<p>从 Microsoft Store 中下载 Windows Terminal:</p>
<p>Windows Terminal on the Microsoft Store <sup class="footnote-ref"></sup></p>
<p><img src="https://img2020.cnblogs.com/blog/2074831/202012/2074831-20201227213223336-210686177.png" alt="Windows Terminal on the Microsoft Store" loading="lazy"></p>
<p>也可以从 GitHub 下载 Windows Terminal。</p>
<h2 id="运行-wsl-上的-ubuntu">运行 WSL 上的 Ubuntu</h2>
<p>打开 Windows Terminal 并运行:</p>
<pre><code class="language-powershell">ubuntu.exe
</code></pre>
<p>当您首次在 WSL 上运行 Ubuntu 时,它将安装,并提示您创建一个 Linux 用户,这个用户是独立于 Windows 用户的。</p>
<p><img src="https://img2020.cnblogs.com/blog/2074831/202012/2074831-20201227213253587-1013088767.png" alt="Run Ubuntu on WSL" loading="lazy"></p>
<p>退出并重新打开 Windows Terminal,您将会发现 Ubuntu 出现在下拉菜单中:</p>
<p><img src="https://img2020.cnblogs.com/blog/2074831/202012/2074831-20201227213321247-147814687.png" alt="Ubuntu on the drop-down" loading="lazy"></p>
<p>您可以在 settings.json 中设置 Windows Terminal,将 Ubuntu 设置为默认项。</p>
<h2 id="更新-wsl-上的-ubuntu">更新 WSL 上的 Ubuntu</h2>
<p>您应该定期检查更新,并在 WSL 上的 Ubuntu 中运行升级。我们用 apt (Ubuntu 包管理器)来实现。</p>
<p>要检查更新,请运行:</p>
<pre><code class="language-bash">sudo apt update
</code></pre>
<p><img src="https://img2020.cnblogs.com/blog/2074831/202012/2074831-20201227213353167-515800963.png" alt="sudo apt update" loading="lazy"></p>
<p>要获得升级,请运行:</p>
<pre><code class="language-bash">sudo apt upgrade
</code></pre>
<p><img src="https://img2020.cnblogs.com/blog/2074831/202012/2074831-20201227213420975-1742301387.png" alt="sudo apt upgrade" loading="lazy"></p>
<p>您可以通过用 <code>&amp;&amp;</code> 将它们连接在同一行并添加 <code>-y</code> 标签,自动更新并应用可用的升级:</p>
<pre><code class="language-bash">sudo apt update &amp;&amp; sudo apt upgrade -y
</code></pre>
<h2 id="添加微软的-net-资源库和签名密钥">添加微软的 .NET 资源库和签名密钥</h2>
<p>我们需要为 apt 添加微软的 .NET 资源库和签名密钥。我们将从微软下载并安装一个包来完成这项工作。</p>
<p>请确保您正在为您的 Ubuntu 版本安装正确的资源库。您可以使用下面的命令检查 Ubuntu 的当前版本:</p>
<pre><code class="language-bash">cat /etc/os-release
</code></pre>
<p>下面的示例使用 Ubuntu 20.04,来自 Canonical 的最新 LTS 发行版。如果您仍在使用 Ubuntu 16.04、18.04 或 19.10,您可以在微软文档 <sup class="footnote-ref"></sup>中找到相应的资源库。想要了解更多关于 LTS 和中间版本之间的区别,我们有一个发布周期页面 <sup class="footnote-ref"></sup>。</p>
<p>为 20.04 版本下载微软的资源库和密钥包:</p>
<pre><code class="language-bash">wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
</code></pre>
<p><img src="https://img2020.cnblogs.com/blog/2074831/202012/2074831-20201227213455511-1923516606.png" alt="Download the Microsoft repository and key package" loading="lazy"></p>
<p>使用 dpkg -i 手动安装微软资源包:</p>
<pre><code class="language-bash">sudo dpkg -i packages-microsoft-prod.deb
</code></pre>
<p><img src="https://img2020.cnblogs.com/blog/2074831/202012/2074831-20201227213529059-1317679882.png" alt="Install the Microsoft repo package" loading="lazy"></p>
<p>现在当你更新 apt 时,你会看到微软资源库已检查升级了:</p>
<p><img src="https://img2020.cnblogs.com/blog/2074831/202012/2074831-20201227213621876-999739065.png" alt="apt update" loading="lazy"></p>
<h2 id="安装-net-sdk">安装 .NET SDK</h2>
<p>使用 apt 从微软资源库安装 .NET 和相关依赖项:</p>
<pre><code class="language-bash">sudo apt-get install dotnet-sdk-3.1 -y
</code></pre>
<p><img src="https://img2020.cnblogs.com/blog/2074831/202012/2074831-20201227213652004-1854497655.png" alt="Install the .NET SDK" loading="lazy"></p>
<h2 id="新建工作区">新建工作区</h2>
<p>创建一个新的工作目录并打开该目录:</p>
<pre><code class="language-bash">mkdir dotnetproject
cd dotnetproject/
</code></pre>
<p><img src="https://img2020.cnblogs.com/blog/2074831/202012/2074831-20201227213719280-657239682.png" alt="Create a workspace" loading="lazy"></p>
<h2 id="新建一个-net-项目">新建一个 .NET 项目</h2>
<p>使用 <code>dotnet new</code> 创建一个新的 .NET 控制台项目,这会创建一个名为 <code>Program.cs</code> 的文件和其他一些必要的文件夹和文件:</p>
<pre><code class="language-bash">dotnet new console
</code></pre>
<p><img src="https://img2020.cnblogs.com/blog/2074831/202012/2074831-20201227213752031-1481428127.png" alt="Create a new .NET project" loading="lazy"></p>
<h2 id="探索我们的-net-应用">探索我们的 .NET 应用</h2>
<p>列出您的新 .NET 项目中的文件:</p>
<pre><code class="language-bash">ls
</code></pre>
<p>查看 <code>Program.cs</code> 的内容:</p>
<pre><code class="language-bash">cat Program.cs
</code></pre>
<p><img src="https://img2020.cnblogs.com/blog/2074831/202012/2074831-20201227213834690-1886102580.png" alt="Explore our .NET app" loading="lazy"></p>
<p>运行示例程序:</p>
<pre><code class="language-bash">dotnet run
</code></pre>
<p><img src="https://img2020.cnblogs.com/blog/2074831/202012/2074831-20201227213907363-947660814.png" alt="Run the sample program" loading="lazy"></p>
<h2 id="自定义我们的-net-应用">自定义我们的 .NET 应用</h2>
<p>在您最喜欢的编辑器中打开 <code>Program.cs</code>:vi、nano、emacs 或者有 remote WSL 扩展的 VS Code:</p>
<p><img src="https://img2020.cnblogs.com/blog/2074831/202012/2074831-20201227213938930-1332215279.png" alt="Code with the remote WSL extension" loading="lazy"></p>
<p>在这里,我们使用 WSL 上的 Ubuntu 中包含的 nano:</p>
<pre><code class="language-bash">nano Program.cs
</code></pre>
<p><img src="https://img2020.cnblogs.com/blog/2074831/202012/2074831-20201227214008578-1294189585.png" alt="nano Program.cs" loading="lazy"></p>
<p>首先,我们添加 Interop services 命名空间:</p>
<pre><code class="language-csharp">using System.Runtime.InteropServices;
</code></pre>
<p>然后把:</p>
<pre><code class="language-csharp">Console.WriteLine("Hello World!");
</code></pre>
<p>替换成:</p>
<pre><code class="language-csharp">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);
</code></pre>
<p><img src="https://img2020.cnblogs.com/blog/2074831/202012/2074831-20201227214042943-1590388013.png" alt="replace code" loading="lazy"></p>
<p>这段代码也可以在这里 <sup class="footnote-ref"></sup>找到。</p>
<p>这个应用程序告诉我们:当前的用户,检查是在 Windows 还是 Linux 上,然后给出 OS 内核版本。</p>
<p>退出并保存,然后运行:</p>
<pre><code class="language-bash">dotnet run
</code></pre>
<p><img src="https://img2020.cnblogs.com/blog/2074831/202012/2074831-20201227214114426-1057242758.png" alt="Exit and save and run" loading="lazy"></p>
<h2 id="让我们的-net-应用程序跨平台">让我们的 .NET 应用程序跨平台</h2>
<p>我们需要更新 .NET 项目文件 <code>dotnetproject.csproj</code>,告诉 .NET 同时为 Linux 和 Windows 平台构建。</p>
<p>在我们的编辑器中打开 <code>dotnetproject.csproj</code> 并添加:</p>
<pre><code class="language-xml">&lt;PropertyGroup&gt;
    &lt;RuntimeIdentifiers&gt;win10-x64;linux-x64&lt;/RuntimeIdentifiers&gt;
&lt;/PropertyGroup&gt;
</code></pre>
<p>这将引导 .NET 同时为 Windows 10 x64 和 Linux x64 构建自包含的二进制文件。</p>
<p><img src="https://img2020.cnblogs.com/blog/2074831/202012/2074831-20201227214146286-772559880.png" alt="Make our .NET application cross-platform" loading="lazy"></p>
<h2 id="构建我们的跨平台应用程序">构建我们的跨平台应用程序</h2>
<p>当我们配置好项目后,构建 .NET 应用程序变得如此简单:</p>
<pre><code class="language-csharp">dotnet publish -r win10-x64
dotnet publish -r linux-x64
</code></pre>
<p><img src="https://img2020.cnblogs.com/blog/2074831/202012/2074831-20201227214212182-1701473869.png" alt="dotnet publish" loading="lazy"></p>
<p>可以在项目的 <code>/bin/</code> 文件夹中找到每个平台的自包含二进制文件及其所有必需的库:</p>
<pre><code class="language-bash">ls bin/Debug/netcoreapp3.1/
</code></pre>
<p><img src="https://img2020.cnblogs.com/blog/2074831/202012/2074831-20201227214241206-285891411.png" alt="ls bin/Debug/netcoreapp3.1/" loading="lazy"></p>
<h2 id="测试-linux-版本">测试 Linux 版本</h2>
<p>您可以直接运行 Linux 二进制文件,如下所示:</p>
<pre><code class="language-bash">./bin/Debug/netcoreapp3.1/linux-x64/publish/dotnetproject
</code></pre>
<p><img src="https://img2020.cnblogs.com/blog/2074831/202012/2074831-20201227214313179-1347279807.png" alt="Test Linux build" loading="lazy"></p>
<h2 id="测试-windows-版本">测试 Windows 版本</h2>
<p>要运行 Windows 版本,请将其复制到 Windows 文件系统中:</p>
<pre><code class="language-bash">cp -r ~/dotnetproject/bin/Debug/netcoreapp3.1/win10-x64/publish /mnt/c/Users/Hayden/OneDrive/Desktop/
</code></pre>
<blockquote>
<p>译者注:<br>
此处的 <code>/mnt/</code> 为 Ubuntu 系统中看到的 Windows 文件系统的根目录,<code>/mnt/c/</code> 即为 Windows 系统中的 C 盘。</p>
</blockquote>
<p>然后运行:</p>
<pre><code class="language-bash">/mnt/c/Users/Hayden/OneDrive/Desktop/publish/dotnetproject.exe
</code></pre>
<p><img src="https://img2020.cnblogs.com/blog/2074831/202012/2074831-20201227214344811-1026101434.png" alt="Test Windows build" loading="lazy"></p>
<p>至此,我们已经为 Linux 和 Windows 构建并运行了相同的应用程序。我们可以使用 WSL 同时测试它们。</p>
<br>
<blockquote>
<p>作者 : haydenb<br>
译者 : 技术译民<br>
出品 : 技术译站<br>
链接 : 英文原文</p>
</blockquote>
<hr class="footnotes-sep">
<section class="footnotes">
<ol class="footnotes-list">
<li id="fn1" class="footnote-item"><p>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 ↩︎</p>
</li>
<li id="fn2" class="footnote-item"><p>https://ubuntu.com/wsl Ubuntu on WSL ↩︎</p>
</li>
<li id="fn3" class="footnote-item"><p>https://ubuntu.com/blog/ubuntu-on-wsl-2-is-generally-available Ubuntu on WSL 2 Is Generally Available ↩︎</p>
</li>
<li id="fn4" class="footnote-item"><p>https://www.microsoft.com/store/productId/9N6SVWS3RX71 Ubuntu 20.04 LTS on the Microsoft Store ↩︎</p>
</li>
<li id="fn5" class="footnote-item"><p>https://wiki.ubuntu.com/WSL Ubuntu on WSL wiki ↩︎</p>
</li>
<li id="fn6" class="footnote-item"><p>https://www.microsoft.com/store/productId/9N0DX20HK701 Windows Terminal on the Microsoft Store ↩︎</p>
</li>
<li id="fn7" class="footnote-item"><p>https://docs.microsoft.com/en-us/dotnet/core/install/linux-ubuntu ↩︎</p>
</li>
<li id="fn8" class="footnote-item"><p>https://ubuntu.com/about/release-cycle ↩︎</p>
</li>
<li id="fn9" class="footnote-item"><p>https://pastebin.ubuntu.com/p/swbPxXXSKD/ ↩︎</p>
</li>
</ol>
</section>


</div>
<div id="MySignature" role="contentinfo">
    <div><p style="font-size: 14px; font-family: '微软雅黑';font-weight: 400; padding: 0 0 5px 2px;color:#888;">&copy; 转载请标明出处 &nbsp; https://www.cnblogs.com/ittranslator</p></div>
<div style="text-align: center;max-width: 280px;margin: 10px auto;">
   <p style="font-size: 18px; font-weight: 600; color: rgba(0, 0, 0, 1); padding-top: 6px; padding-bottom: 6px; border-bottom: 1px dashed rgba(119, 119, 255, 1)">不做标题党,只分享技术干货
   </p><p style="font-size: 13px; font-weight: 400; padding-top: 6px; padding-bottom: 0px;color:rgb(66,66,166);">公众号『技术译站』,<b>欢迎扫码关注</b></p>
   <img style="width: 215px;" src="https://img2020.cnblogs.com/blog/2074831/202006/2074831-20200628152541133-1651846078.jpg" alt="">
</div><br><br>
来源:https://www.cnblogs.com/ittranslator/p/14198925.html
頁: [1]
查看完整版本: 在 WSL Ubuntu 上使用 .NET 进行跨平台开发新手入门