当入门项目引用了另一个内部类库时,我在VSCode中构建dotnet核心解决方案进行调试时遇到了一些问题。我安装了“C# for Visual Studio Code(由OmniSharp提供支持)”扩展。我在Ubuntu 22.04上运行dotnet 6.0.403 sdk。
虽然我可以毫无问题地从命令行编写、构建和运行引用类库的程序,但当从VS代码的“运行和调试”部分启动时,它们无法构建。
我尝试从头开始完成一个基本的演示解决方案:
mkdir DebugCode && cd DebugCode
dotnet new sln
dotnet new console -o DebugCode.Console
dotnet new classlib -o DebugCode.Core
dotnet sln add DebugCode.Console/Debug.Console.csproj
dotnet sln add DebugCode.Core/DebugCode.Core.csproj
我在DebugCode.Core
项目中放置了一个简单的SockDrawer.cs
类,代码如下:
namespace DebugCode.Core;
public class SockDrawer
{
private IList<string> Socks { get; set; } = new List<string>();
public SockDrawer()
{
FillDrawer();
}
public void FillDrawer()
{
Socks.Add("Godzilla socks");
Socks.Add("Sasquatch socks");
Socks.Add("Blue Lightning socks");
Socks.Add("boring work socks");
}
public void ListSocks()
{
foreach(var socks in Socks)
{
Console.Write($"{socks}, ");
}
Console.Write(Environment.NewLine);
}
}
然后我在DebugCode.Console
项目的Program.cs
中引用了它。
using DebugCode.Core;
var sockdrawer = new SockDrawer();
sockdrawer.ListSocks();
我可以从根DebugCode目录构建并执行程序,没有任何问题
dotnet run --project DebugCode.Console
当我尝试启动构建进行调试时,问题开始出现。从“运行和调试”部分启动和构建时,构建失败。使用默认扩展名生成launch.json
和tasks.json
文件,其内容为:
launch.json
{
"version": "0.2.0",
"configurations": [
{
"name": ".NET Core Launch (console)",
"type": "coreclr",
"request": "launch",
"preLaunchTask": "build",
"program": "${workspaceFolder}/DebugCode.Console/bin/Debug/net6.0/DebugCode.Console.dll",
"args": [],
"cwd": "${workspaceFolder}/DebugCode.Console",
"console": "integratedTerminal", // I did manually update this line
"stopAtEntry": false
},
{
"name": ".NET Core Attach",
"type": "coreclr",
"request": "attach"
}
]
}
tasks.json
{
"version": "2.0.0",
"tasks": [
{
"label": "build",
"command": "dotnet",
"type": "process",
"args": [
"build",
"${workspaceFolder}/DebugCode.Console/DebugCode.Console.csproj",
"/property:GenerateFullPaths=true",
"/consoleloggerparameters:NoSummary"
],
"problemMatcher": "$msCompile"
},
{
"label": "publish",
"command": "dotnet",
"type": "process",
"args": [
"publish",
"${workspaceFolder}/DebugCode.Console/DebugCode.Console.csproj",
"/property:GenerateFullPaths=true",
"/consoleloggerparameters:NoSummary"
],
"problemMatcher": "$msCompile"
},
{
"label": "watch",
"command": "dotnet",
"type": "process",
"args": [
"watch",
"run",
"--project",
"${workspaceFolder}/DebugCode.Console/DebugCode.Console.csproj"
],
"problemMatcher": "$msCompile"
}
]
}
引用依赖类库时出现找不到文件错误:
Executing task: dotnet build [redacted]/DebugCode/DebugCode.Console/DebugCode.Console.csproj /property:GenerateFullPaths=true /consoleloggerparameters:NoSummary
MSBuild version 17.3.2+561848881 for .NET
Determining projects to restore...
Restored [redacted]/DebugCode/DebugCode.Console/DebugCode.Console.csproj (in 62 ms).
1 of 2 projects are up-to-date for restore.
DebugCode.Core -> [redacted]/DebugCode/DebugCode.Core/bin/Debug/net6.0/DebugCode.Core.dll
CSC : error CS0006: Metadata file '[redacted]/DebugCode/DebugCode.Core/obj/Debug/net6.0/ref/DebugCode.Core.dll' could not be found [[redacted]/DebugCode/DebugCode.Console/DebugCode.Console.csproj]
* The terminal process "dotnet 'build', '[redacted]/DebugCode/DebugCode.Console/DebugCode.Console.csproj', '/property:GenerateFullPaths=true', '/consoleloggerparameters:NoSummary'" terminated with exit code: 1.
* Terminal will be reused by tasks, press any key to close it.
基于此错误,我尝试更新生成任务以生成整个解决方案,而不仅仅是控制台项目。
{
"label": "build",
"command": "dotnet",
"type": "process",
"args": [
"build",
"${workspaceFolder}/DebugCode.sln",
"/property:GenerateFullPaths=true",
"/consoleloggerparameters:NoSummary"
],
"problemMatcher": "$msCompile"
}
在这种情况下,生成成功,但调试失败,因为缺少DebugCode.Console.deps.json文件:
[redacted].vscode/extensions/ms-dotnettools.csharp-1.25.2-linux-x64/.debugger/vsdbg --interpreter=vscode --connection=/tmp/CoreFxPipe_vsdbg-ui-e0801ed66b6a4fb8aa6f0c54a5fc2cc3
Cannot use file stream for [[redacted]/DebugCode/DebugCode.Console/bin/Debug/net6.0/DebugCode.Console.deps.json]: No such file or directory
A fatal error was encountered. The library 'libhostpolicy.so' required to execute the application was not found in '[redacted]/DebugCode.Console/bin/Debug/net6.0/'.
Failed to run as a self-contained app.
- The application was run as a self-contained app because '[redacted]/DebugCode/DebugCode.Console/bin/Debug/net6.0/DebugCode.Console.runtimeconfig.json' was not found.
- If this should be a framework-dependent app, add the '[redacted]/DebugCode/DebugCode.Console/bin/Debug/net6.0/DebugCode.Console.runtimeconfig.json' file and specify the appropriate framework.
有趣的是,如果我自己使用DebugCode目录中的dotnet build DebugCode.sln
命令手动构建解决方案,则会生成上面引用的DebugCode.Console.deps.json
文件。然后,当我注解掉launch.json的"preLaunchTask": "build"
行时,调试器会从“Run and Debug”部分成功启动。我想我一定是在tasks.json
中的“build”任务中出错了。但是我没有意识到手动使用的dotnet build
命令与tasks.json
需要的命令之间的区别。
1条答案
按热度按时间piv4azn71#
通过从解决方案文件的路径中删除${workspaceFolder},我获得了preLaunchTask以在调试器中成功构建和启动解决方案。
我不太明白这是为什么,但至少我在构建和调试。