Visual Studio 在 Linux 上的 .NET Core 中将调试器附加到远程进程 运行 的扩展

Visual Studio Extension to attach debugger to remote process running in .NET Core on Linux

我正在使用 Visual Studio 2019 开发一个 .NET Core 3 应用程序,该应用程序 运行 在嵌入式 Linux 上运行。我能够在 Visual Studio 2019 中构建代码。如果我手动将二进制文件复制到 Linux 机器,然后在那里启动应用程序 运行ning,那么我就可以附加 Visual Studio 调试器在 Linux 中通过 SSH 连接到远程进程并调试应用程序。这确实有效,但部署它、启动它并为每个调试会话手动附加调试器非常乏味。我在 Visual Studio Code 中确实有一个脚本可以运行,但我想使用 Visual Studio Professional。

我正在尝试编写一个 Visual Studio 扩展,以便我可以按 Visual Studio 中的一个键来构建、部署、启动应用程序,然后连接到调试器。然后我会与我的团队分享扩展。它几乎可以正常工作,除了附加调试器。

在扩展中,我可以使用以下代码列出 Linux 机器中的进程 运行ning 和 select 我的应用程序:

EnvDTE100.Debugger5 debugger = (EnvDTE100.Debugger5)dte.Debugger;
EnvDTE80.Transport transport = debugger.Transports.Item("SSH");
EnvDTE80.Engine engine = transport.Engines.Item("Managed (.NET Core for Unix)");
EnvDTE80.Process2 process = (EnvDTE80.Process2)debugger.GetProcesses(transport, "192.168.11.1").Item("app");
process.Attach2(debugger);

有两个问题:

  1. 调用 GetProcesses() 会打开一个对话框,我需要在其中输入 Linux 用户名并按回车键,如何在代码中指定用户名以避免出现对话框?
  2. 即使 selected 过程看起来是正确的(process.ProcessID 匹配我在 Linux 中看到的内容,如果我 运行 ps 命令),调用 Attach2() 时出现异常。异常消息是 "Exception from HRESULT: 0x8971001E"

我觉得我真的快要完成它了,关于如何完成它有什么建议吗?

我找到了如何添加用户名,而不是密码:

GetProcess()中,将transportQualifier设置为$"{userName}@{hostName}"

第一次 Window 仍会弹出并要求输入密码。 但在那之后 VisualStudio 存储了包括密码在内的连接。

我也解决了第二个问题,方法是将调试器传递给Attach2()的参数改成引擎,如下图:

EnvDTE100.Debugger5 debugger = (EnvDTE100.Debugger5)dte.Debugger;
EnvDTE80.Transport transport = debugger.Transports.Item("SSH");
EnvDTE80.Engine engine = transport.Engines.Item("Managed (.NET Core for Unix)");
EnvDTE80.Process2 process = (EnvDTE80.Process2)debugger.GetProcesses(transport, "root@192.168.11.1").Item("app");
process.Attach2(engine);