在 VisualStudio 中以 WSL 方式启动程序的过程纪实

在 VisualStudio 中以 WSL 方式启动程序的过程纪实

在 VisualStudio 中以 WSL 方式启动程序的过程纪实

独立观察员  2023 年 9 月 28 日

一、安装 WSL

WSL 是 “Windows Subsystem for Linux” 的缩写,也就是运行在 Windows 系统中的 Linux 子系统。如果我们的应用程序最终是会放在 Linux 系统中运行的话,那么在开发阶段就以这种方式启动调试,就能提前发现在真实线上环境可能出现的问题,有利于增强程序的健壮性。

 

VS 中以 WSL 方式启动程序,会自动安装 WSL(本次我选择的是 Ubuntu,还可以选择 Debian):

在 VisualStudio 中以 WSL 方式启动程序的过程纪实

 

二、安装 ASP.NET Core 运行环境

安好之后再次点击启动,会提示没有安装 ASP.NET Core 6.0 环境:

在 VisualStudio 中以 WSL 方式启动程序的过程纪实

 

点击确定可安装,不过大概率会因为网络等原因失败,而且窗口一闪而过,看不到错误信息。可以在窗口刚出现时进行截图,能看到执行脚本的命令和路径:

在 VisualStudio 中以 WSL 方式启动程序的过程纪实

 

我这次的路径为 C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\IDE\Extensions\m0dgxku3.ps5\Scripts:

在 VisualStudio 中以 WSL 方式启动程序的过程纪实

 

完整命令为(大写都改为小写,除了文件名):

wsl.exe -- "/mnt/c/program files/microsoft visual studio/2022/enterprise/common7/ide/extensions/m0dgxku3.ps5/scripts/InstallDotNet.sh" aspnetcore 6.0

 

在执行前,可先临时(重启 cmd 后失效)设置代理:

# 设置 socks5 代理
set http_proxy=socks5://dlgcy:w1xxx@d.dlgcy.com:10888
# 验证
curl -I www.google.com

 

返回 200 证明成功:

在 VisualStudio 中以 WSL 方式启动程序的过程纪实

 

然后即可执行命令:

在 VisualStudio 中以 WSL 方式启动程序的过程纪实

 

不过报了不支持代理错误,重开 cmd 进行清除 cmd 代理后,还是报代理不支持,说明是我之前在 WSL 中设置的不对:

在 VisualStudio 中以 WSL 方式启动程序的过程纪实

 

之前是按照《如何在 Linux 系统环境下配置 s5 代理(socks5 代理)?》中说的:

如果你想在整个系统中使用 socks5 代理,你可以将代理配置添加到 /etc/environment 文件中:

http_proxy=”socks5://127.0.0.1:1080″

https_proxy=”socks5://127.0.0.1:1080″

ftp_proxy=”socks5://127.0.0.1:1080″

socks_proxy=”socks5://127.0.0.1:1080″

这样,所有的网络请求都将通过 socks5 代理进行连接。

 

先把它清除了,顺便演示一下进入和离开 WSL 的命令(进入 –wsl,离开 –exit):

在 VisualStudio 中以 WSL 方式启动程序的过程纪实

 

再次在 cmd 中设置代理后执行命令,没有报错了,但是速度非常慢:

在 VisualStudio 中以 WSL 方式启动程序的过程纪实

 

看来是 cmd 的代理对 wsl 不起作用,还得在 WSL 中设置代理才行。

 

按照《debian_ubuntu 配置 sock/socks5h/http/https 代理》(已记录笔记)的方法可成功设置代理:

在 VisualStudio 中以 WSL 方式启动程序的过程纪实

 

速度有所改善(其实也差不了多少):

在 VisualStudio 中以 WSL 方式启动程序的过程纪实

 

然后就安好了:

在 VisualStudio 中以 WSL 方式启动程序的过程纪实

 

三、安装调试组件 vsdbg

在 VS 中以 WSL 方式启动还是不行(重启之后也不行):

在 VisualStudio 中以 WSL 方式启动程序的过程纪实

 

3.1、方式一:使用脚本安装(失败)

按照文章《记一次 Visual Studio 启动 WSL 远程调试的方法》的方法,我们直接在 WSL 系统中找到脚本路径,我本次的为 [/mnt/c/program files/microsoft visual studio/2022/enterprise/common7/ide/extensions/m0dgxku3.ps5/scripts]:

在 VisualStudio 中以 WSL 方式启动程序的过程纪实

 

然后就是执行脚本了(./UpdateDebugger.sh),但是开启代理提示无网络,关闭代理显示连接超时,太难了:

在 VisualStudio 中以 WSL 方式启动程序的过程纪实

 

关闭代理后,再次尝试,又开始下载了,第二天一看,还是失败了:

在 VisualStudio 中以 WSL 方式启动程序的过程纪实

 

看看 ./UpdateDebugger.sh 的脚本内容吧,发现主角是 getvsdbgsh.sh 脚本:

#!/bin/bash
 
#-----------------------------------------------------------------------------
# Copyright (c) Microsoft Corporation.  All rights reserved.
#-----------------------------------------------------------------------------
 
set -e
 
curl -sSL https://aka.ms/getvsdbgsh -o /tmp/getvsdbgsh.sh
cat /tmp/getvsdbgsh.sh | /bin/sh /dev/stdin -v latest -l $HOME/vsdbg;

 

通过 vim /tmp/getvsdbgsh.sh 查看,发现内容很多,就不看了。直接运行上面的最后一句,结果和之前差不多:

在 VisualStudio 中以 WSL 方式启动程序的过程纪实

 

编辑 /tmp/getvsdbgsh.sh,把 download () 方法中的网络检查注释掉:

在 VisualStudio 中以 WSL 方式启动程序的过程纪实

 

重新执行命令,现在是提示无法下载 xxx 文件,经过排查,原来是不支持代理设置中的 “socks5h”(DNS 也走代理):

在 VisualStudio 中以 WSL 方式启动程序的过程纪实

 

将代理改为 socks5,发现也不支持。然后发现 curl 命令应该是支持的:

在 VisualStudio 中以 WSL 方式启动程序的过程纪实

 

所以再次编辑 /tmp/getvsdbgsh.sh 文件,直接使用 crul:

 在 VisualStudio 中以 WSL 方式启动程序的过程纪实

 

再次执行命令,还是下载不了(摔!):

在 VisualStudio 中以 WSL 方式启动程序的过程纪实

 

3.2、方式二:下载组件并手动安装

通过浏览器也是下载不了的,看来只能祭出大杀器了 —— 直接登陆香港服务器下载:

在 VisualStudio 中以 WSL 方式启动程序的过程纪实

 

然后再从服务器上下到本地,并放到 C 盘,然后拷贝到 /tmp 目录下,不对,有可能是 /root/vsdbg 目录,结果还是不行:

在 VisualStudio 中以 WSL 方式启动程序的过程纪实

 

百度一下这个 vsdbg-linux-x64.tar.gz 文件如何安装吧。

经过《[VS Code] 附加到 Docker 容器中调试 .NET 程序》一文的启发,应当使用如下命令安装(注意相关文件的路径,按实际情况修改):

source /tmp/getvsdbgsh.sh -v latest -l /root/vsdbg -e /tmp/vsdbg-linux-x64.tar.gz

 

果然成功:

在 VisualStudio 中以 WSL 方式启动程序的过程纪实

 

四、安装 .NET SDK

再次使用 WSL 模式在 VS 中启动程序试试,发现报错了:

在 VisualStudio 中以 WSL 方式启动程序的过程纪实

 

按照提示执行命令 dotnet dev-certs https,好像又说缺少了 .NET SDK:

在 VisualStudio 中以 WSL 方式启动程序的过程纪实

 

按照给出的链接,最终定位了这个在 Ubuntu 中安装 .NET 的链接:

https://learn.microsoft.com/zh-cn/dotnet/core/install/linux-ubuntu-2204#install-the-sdk 

(手动安装可参考:https://learn.microsoft.com/zh-cn/dotnet/core/install/linux-scripted-manual#manual-install

 

具体安装 .NET 6.0 的命令如下:

# 安装 SDK(如果安装 .NET SDK,则无需安装相应的运行时)
sudo apt-get update && 
sudo apt-get install -y dotnet-sdk-6.0
 
# 安装运行时
sudo apt-get update && 
sudo apt-get install -y aspnetcore-runtime-6.0

 

经过 2 小时 52 分钟之后下载好了:

在 VisualStudio 中以 WSL 方式启动程序的过程纪实

 

后续自动安装和欢迎语:

在 VisualStudio 中以 WSL 方式启动程序的过程纪实

 

五、安装证书和启动调试

此时如果再次直接运行程序,就还是会报那个证书的错误,所以还要执行一下那个安装证书的命令:

在 VisualStudio 中以 WSL 方式启动程序的过程纪实

 

此时再次启动程序就不会报错了,没有命令行窗口弹出,信息是在 VS 的输出窗口中展现:

在 VisualStudio 中以 WSL 方式启动程序的过程纪实

 

直接访问给出的链接即可:

在 VisualStudio 中以 WSL 方式启动程序的过程纪实

 

六、总结和资源

6.1、总结

本文记录了 VS 开启 WSL 调试支持的全过程,过程中走了一些弯路,感觉最大的阻碍还是网络问题(而且纵观本次实践过程和结果,开不开启代理都差不多)。

能分享给大家的可能就是我下载下来的可在 Linux 中使用的 VS 调试组件了(获取方式见下一小节)。

至于网络问题,不知道这个情况下使用镜像站有没有帮助,比如清华的镜像站([Ubuntu 软件仓库镜像使用帮助](https://mirror.tuna.tsinghua.edu.cn/help/ubuntu/)), 有兴趣的朋友们可以试试。

 

另外,可以看出,微软这个 Linux 子系统的设计还是很巧妙的,相当于把整个 Windows 的磁盘分区目录都挂载到 Linux 子系统的 /mnt 路径下了,这样无论是查找文件还是相互访问,都是很方便的。给大家看看,在 Windows 中是可以直接查看 Linux 子系统的文件目录的:

在 VisualStudio 中以 WSL 方式启动程序的过程纪实

 

打开 mnt,也是能看到 Windows 的盘符的(不过打不开,这个可以理解):

在 VisualStudio 中以 WSL 方式启动程序的过程纪实

 

打开 Linux 的目录是可以的:

在 VisualStudio 中以 WSL 方式启动程序的过程纪实

 

6.2、资源

vsdbg-linux-x64.tar.gz 下载:微信公众号 “独立观察员博客” 后台回复 “vsdbg” 获取下载链接。

 

6.3、参考文章

1、《[debian_ubuntu 配置 sock/socks5h/http/https 代理](https://www.cnblogs.com/yucloud/p/ubuntu_set_proxy.html)》

2、《[记一次 Visual Studio 启动 WSL 远程调试的方法](https://www.cnblogs.com/ACDIV/p/17369166.html)》

3、《[[VS Code] 附加到 Docker 容器中调试 .NET 程序](https://www.jianshu.com/p/c46088a0275f)》

 

 

 

原创文章,转载请注明: 转载自 独立观察员(dlgcy.com)

本文链接地址: [在 VisualStudio 中以 WSL 方式启动程序的过程纪实](https://dlgcy.com/vs-wsl/)

关注微信公众号 独立观察员博客(DLGCY_BLOG) 第一时间获取最新文章

%title插图%num

发表评论