在一个解决方案下使用多个dotnet核心项目在vscode中进行调试

时间:2016-05-22 15:50:42

标签: visual-studio-code

我已经在vscode中使用root"解决方案设置了我的项目"包含定义子项目的global.json。这些目前是我的网络应用程序和类库。

工作正常,我在根目录下设置了以下launch.json,试图调试我的网络应用程序:

{
"version": "0.2.0",
"configurations": [
    {
        "name": "WebApp",
        "type": "coreclr",
        "request": "launch",
        "preLaunchTask": "",
        "program": "${workspaceRoot}/WebApp/bin/Debug/netcoreapp1.0/WebApp.dll",
        "args": [],
        "cwd": "${workspaceRoot}/WebApp/",
        "stopAtEntry": false,
        "launchBrowser": {
            "enabled": true,
            "args": "${auto-detect-url}",
            "osx": {
                "command": "open"
            }
        }
    }
]

}

我有两个问题。

  1. 我不得不删除preLaunchTask构建,因为它尝试从根目录构建。不理想,但我可以先通过手动构建来解决这个问题。

  2. 当调试器启动时,它无法找到源代码,因为它查找根目录而不是子项目。这个是一个显示停止因为我在没有加载源的情况下根本不能使用断点。

  3. 有解决这些问题的方法吗?

    更新:2016年8月9日

    我直接把这个问题带到了Omnisharp并且进一步了解,能够在一个解决方案下调试应用程序和单独的库。尽管如此,Haven还是在一个解决方案下的多个可执行项目中获得了大奖。不幸的是,我不再追求该项目,但希望这可以帮助某人找到完整的解决方案。

    链接到讨论和代码示例:https://github.com/OmniSharp/omnisharp-vscode/issues/460#issuecomment-228392486

3 个答案:

答案 0 :(得分:5)

嗨大家我遇到同样的问题我的解决方案有以下结构

public class IgnoreDataMemberContractResolver : DefaultContractResolver
{
    // As of 7.0.1, Json.NET suggests using a static instance for "stateless" contract resolvers, for performance reasons.
    // http://www.newtonsoft.com/json/help/html/ContractResolver.htm
    // http://www.newtonsoft.com/json/help/html/M_Newtonsoft_Json_Serialization_DefaultContractResolver__ctor_1.htm
    // "Use the parameterless constructor and cache instances of the contract resolver within your application for optimal performance."
    // See also https://stackoverflow.com/questions/33557737/does-json-net-cache-types-serialization-information
    static IgnoreDataMemberContractResolver instance;

    // Explicit static constructor to tell C# compiler not to mark type as beforefieldinit
    static IgnoreDataMemberContractResolver() { instance = new IgnoreDataMemberContractResolver(); }

    public static IgnoreDataMemberContractResolver Instance { get { return instance; } }

    protected override JsonProperty CreateProperty(System.Reflection.MemberInfo member, MemberSerialization memberSerialization)
    {
        var property = base.CreateProperty(member, memberSerialization);
        if (memberSerialization == MemberSerialization.OptIn)
        {
            // Preserve behavior that [DataMember] supersedes [IgnoreDataMember] when applied in the same type
            // but not when appled to a base type.
            if (!property.Ignored
                && property.AttributeProvider.GetAttributes(typeof(IgnoreDataMemberAttribute), false).Any()
                && !property.AttributeProvider.GetAttributes(typeof(DataMemberAttribute), true).Any())
            {
                property.Ignored = true;
            }
        }
        return property;
    }
}

在.vscode文件夹的task.json文件中,您必须像这样设置选项值:

var settings = new JsonSerializerSettings { ContractResolver = IgnoreDataMemberContractResolver.Instance };
var json = JsonConvert.SerializeObject(serverGeneratedObject, settings);

并在.vscode文件夹中的launch.json文件中,您必须更改程序属性,如下所示:

global.json
|src
--|TestApp
----Program.cs
----project.json
--|ExtLib
----ExtLibClass.cs
----project.json

所以我可以在visual studio代码的解决方案中调试多个项目

答案 1 :(得分:3)

在vs代码v1.10.2中,如果您在根目录中有解决方案,则可以使用多个项目。解决方案应该是visual studio 15格式。

可以使用这些新的dotnet cli命令定义此解决方案:

dotnet new sln //creates a new solution in folder
dotnet sln add <path to the csproj file>  //adds project to solution

另外,要在项目A中添加对某个项目B的引用,您应该移动到项目A文件夹并执行:

dotnet add reference <path to the project B csproj file>  

答案 2 :(得分:0)

如果您有多个可运行的项目,即客户端/服务器:

项目结构:

Project
--|Server
----Program.cs
----project.json
--|Client
----Program.cs
----project.json

我在launch.json

中有两个不同的配置
"configurations": [
    {
        "name": "Server",
        "type": "coreclr",
        "request": "launch",
        "preLaunchTask": "build",
        "program": "${workspaceRoot}/Server/bin/Debug/netcoreapp1.1/Server.dll",
        "args": [],
        "cwd": "${workspaceRoot}/Server",
        "stopAtEntry": false,
        "externalConsole": false
    },
    {
        "name": "Client",
        "type": "coreclr",
        "request": "launch",
        "preLaunchTask": "build",
        "program": "${workspaceRoot}/Client/bin/Debug/netcoreapp1.1/Client.dll",
        "args": [],
        "cwd": "${workspaceRoot}/Client",
        "stopAtEntry": false,
        "externalConsole": false
    }]

tasks.json

{
    "version": "0.1.0",
    "command": "dotnet",
    "isShellCommand": true,
    "args": [],
    "tasks": [
      {
        "taskName": "build",
        "args": ["Server","Client"],
        "isBuildCommand": true,
        "showOutput": "silent",
        "problemMatcher": "$msCompile"
      }
   ]
}

这将设置两个可调试项目,PreBuildTask将在开始调试之前编译argstasks.json字段中指定的项目。 (服务器和客户端项目)

在这种情况下,我已将项目设置为绑定到不同的端口,以便能够同时调试它们,方法是在WebHostBuilder Program.cs中指定{/ 1}}

.UseUrls("http://localhost:5002")

如果您使用的是launchsettings.json,而不是VsCode,则可以在Visual Studio中进行更改。