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

时间:2019-03-10 21:03:10

标签: msbuild roslyn

我有一个内置的解决方案,当我用roslyn加载它时,就像这样:

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);

然后可以找到类型。

在重要的情况下,我的解决方案针对.NET Framework 4.5.2

这是解析引用的唯一方法,即手动添加元数据引用吗?不能通过引用全部在csproj中的事实来完成此操作吗?我怎么知道我需要添加什么参考?

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

2 个答案:

答案 0 :(得分:0)

据我所知,它可能与this issue有关,或者可能与导致this onethis open ticket有关。

引用后者

  

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

     

使用的版本:   2.7.0

复制步骤:

  1. 使用两个项目A和B创建解决方案
  2. 将项目B引用到项目A
  3. 使用以下代码打开项目A:

    var工作区= MSBuildWorkspace.Create(additionalProperties);

    项目项目=工作区。OpenProjectAsync(projectPath).Result;

预期行为:

  

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

实际行为:

  

project.MetadataReferences为空。

答案 1 :(得分:0)

因此,我终于重新考虑了这一点。对我来说,解决方案就是从这个要点开始的:

https://gist.github.com/DustinCampbell/32cd69d04ea1c08a16ae5c4cd21dd3a3

基本上可以强制使用一致版本的MSBuild。

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

然后添加此行:

MSBuildLocator.RegisterDefaults();

在引导程序中的某个位置,然后再使用MSBuildWorkspace打开解决方案。