Roslyn workspace.OpenSolutionAsync().项目总是空的?

Mat*_*Sot 18 roslyn

我正在尝试创建一个自托管的WebAPI 2.0项目,允许您通过API打开/探索/构建.sln解决方案.

这是我的一个控制器中的代码,它应该返回给定.sln路径的项目列表:

public async Task<IHttpActionResult> GetProjects(string slnPath = "")
{
    var workspace = MSBuildWorkspace.Create();
    var solution = await workspace.OpenSolutionAsync(slnPath);
    var projects = solution.Projects;
}
Run Code Online (Sandbox Code Playgroud)

我预计项目举行项目的解决方案,但根据调试器,solution.Projects并且solution.ProjectIds似乎总是空的.

我尝试过多个.sln文件,所有这些文件都可以在Visual Studio中打开,看看它们中有项目.

我已经看到了这个问题,但我的项目不是Visual Studio的添加,它是一个从命令行应用程序调用的类库.

Jas*_*ski 23

这通常是由一些事情引起的,按照共性的顺序:

  1. 您缺少Microsoft.CodeAnalysis.CSharp.Workspaces.dll或Microsoft.CodeAnalysis.VisualBasic.Workspaces.dll的副本.确保在运行项目时,这些DLL位于主Microsoft.CodeAnalysis.Workspaces.dll旁边.

  2. 您正在加载我们不支持的项目类型的解决方案.除了无项目的Web站点项目之外,我们应该支持任何项目类型.类库应该可以正常工作.

  3. 我们有一个错误导致我们错误处理您的特定项目类型.如果是这种情况,请在GitHub上提交错误.

  • 附加说明; 您还需要在任何单元测试项目中包含对"Microsoft.CodeAnalysis.CSharp.dll"和"Microsoft.CodeAnalysis.CSharp.Workspaces.dll"程序集的引用. (4认同)
  • 添加处理程序可能有助于弄清楚为什么加载工作区失败:`workspace.WorkspaceFailed + =(sender,args)=> Console.WriteLine(args.Diagnostic.Message);` (4认同)
  • 对于读者:请注意,这里有一个`Microsoft.CodeAnalysis.CSharp.dll`程序集和一个`Microsoft.CodeAnalysis.CSharp.**工作空间**.dll`程序集.不要忘记像我这样的第二个......:/ (3认同)
  • 我获得了所有程序集引用,但没有加载任何项目。抛出异常或提供一些可用的错误消息属性会很好...... (3认同)

luk*_*jkw 7

如果您在单元测试中遇到此问题,但在生产代码中没有遇到此问题,请确保您在测试项目中引用了Microsoft.CodeAnalysis.CSharp.dll和。Microsoft.CodeAnalysis.CSharp.Workspaces

JYL在所选答案的评论中提到了这一点,但我没有立即看到它。