Msbuild 如何使用roslyn构建和现有解决方案,并解析csproj中的所有引用,以便解析所有类型

Msbuild 如何使用roslyn构建和现有解决方案,并解析csproj中的所有引用,以便解析所有类型,msbuild,roslyn,Msbuild,Roslyn,我有一个解决方案,当我用roslyn加载它时,它内置于vs中,如下所示: var workspace = MSBuildWorkspace.Create(); var solutionPath = @"c:\path\to\my.sln"; var solution = workspace.OpenSolutionAsync(solutionPath).Result; 那么所有项目都有0个元数据引用 如果我尝试从引用的程序集获取类型,如下所示: var compilation = soluti

我有一个解决方案,当我用roslyn加载它时,它内置于vs中,如下所示:

var workspace = MSBuildWorkspace.Create();
var solutionPath = @"c:\path\to\my.sln";
var solution = workspace.OpenSolutionAsync(solutionPath).Result;
那么所有项目都有0个元数据引用

如果我尝试从引用的程序集获取类型,如下所示:

var compilation = solution.Projects.First().GetCompilationAsync().Result;
var myType = compilation.GetTypeByMetadataName("SomeTypeNanme);
var project = project.AddMetadataReference(AssemblyContaningTheType);
它从未找到类型。如果我手动添加如下元数据引用:

var compilation = solution.Projects.First().GetCompilationAsync().Result;
var myType = compilation.GetTypeByMetadataName("SomeTypeNanme);
var project = project.AddMetadataReference(AssemblyContaningTheType);
然后它可以找到类型

我的解决方案以.NET Framework 4.5.2为目标,以防出现问题

这是解析引用(即手动添加元数据引用)的唯一方法吗?难道不能通过参考文献都在csproj中这一事实来实现吗?我怎样才能知道我需要添加哪些参考资料


理想情况下,我希望自动解析引用,但可以使用指针从项目文件中的信息构建所有必要的元数据引用…

据我所知,它可能与相关,或者可能导致

引用后者

引用来自同一解决方案的其他项目的项目的空MetadataReferences

使用的版本: 2.7.0

复制步骤:

  • 创建包含两个项目(A和B)的解决方案

  • 将项目B转为项目A

  • 使用以下代码打开项目A:

    var workspace=MSBuildWorkspace.Create(additionalProperties)

    Project=workspace.OpenProjectAsync(projectPath).Result

  • 预期行为:

    project.MetadataReferences应包含项目的引用,如mscorlib.dll

    实际行为:

    project.MetadataReferences为空


    所以我终于有时间再看一次。对我来说,解决方案来自以下要点:

    这基本上强制使用MSBuild的一致版本

    首先添加对Microsoft.Build.Locator的引用(它说它适用于MSBuild 15,但我适用于MSBuild 16)

    然后添加以下行:

    MSBuildLocator.RegisterDefaults()


    在启动过程中的某个地方,在使用msbuild Workspace打开解决方案之前。

    现在无法编辑文本以获得更好的格式,编辑器一直告诉我一些代码格式不好:-/我会试试,但我使用的是文章中提到的特定msbuild Workspace包,该包声称已修复此问题。我会更新这个问题,让它更清楚,一个在公开票证中的链接让我找到了一个解决方案,我把它作为一个答案发布了出来。谢谢。很高兴你能来!我几乎从未使用过MS VS,当然也从未以这种方式使用过,我只是收集了一些考虑到您的问题而想到使用的参考资料^?另请参阅以下关于
    MSBuildWorkspace
    可能需要的某些绑定重定向的答案: