【问题标题】:How do I build and existing solution with roslyn and have all references in the csproj be resolved so I can resolve all types如何使用 roslyn 构建和现有解决方案并解析 csproj 中的所有引用,以便我可以解析所有类型
【发布时间】:2019-11-05 02:17:37
【问题描述】:

我有一个内置的解决方案。当我像这样用 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中的事实来完成吗?我怎么知道我需要添加哪些参考资料?

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

【问题讨论】:

  • 在没有附加调试器的情况下运行代码时是否会出现此问题?另请参阅有关MSBuildWorkspace 可能需要的一些绑定重定向的答案:stackoverflow.com/a/55111549/300908

标签: msbuild roslyn


【解决方案1】:

据我所知,它可能与this issue 相关,或者可能与this one 相关,从而导致this open ticket。

引用后者

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

使用的版本: 2.7.0

复制步骤:

  1. 使用两个项目 A 和 B 创建解决方案

  2. 将项目 B 引用到项目 A

  3. 使用此代码打开项目 A:

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

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

预期行为:

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

实际行为:

project.MetadataReferences 为空。

【讨论】:

  • 现在无法编辑文本以获得更好的格式,编辑器一直告诉我一些代码格式错误:-/
  • 我会尝试的,但我使用的是帖子中提到的特定 msbuild 工作区包,它声称已经解决了这个问题。我会尽快更新问题以明确说明
  • 公开票证中的链接引导我找到了一个解决方案,我已将其发布为答案。谢谢。
  • 很高兴你能成功!我几乎从未使用过 MS VS,当然也从未以这种方式使用过,而且我只收集了一些我认为考虑到您的问题的参考资料^^
【解决方案2】:

所以我终于有时间再看看这个。我的解决方案来自这个要点:

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

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

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

然后添加这一行:

MSBuildLocator.RegisterDefaults();

在引导过程中的某个位置,在您使用 MSBuildWorkspace 打开解决方案之前。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-13
    相关资源
    最近更新 更多