我正在尝试编写一个分析器,以使用roslyn语法树获取有关某些方法的信息。问题是:我正在编写的分析器需要与我想要分析的解决方案在同一个解决方案中。 所以,这是我的代码:
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
public static class Main
{
public static Solution solution { get; set; } = null;
public static string GetMethodInfo(string methodToFind)
{
Task<Solution> GetSolutionTask = null;
string namespaceToFind, classToFind, methodToFind, invocationToFind;
if (solution == null)
{
var workspace = Microsoft.CodeAnalysis.MSBuild.MSBuildWorkspace.Create();
GetSolutionTask = workspace.OpenSolutionAsync(Config.SolutionPath);
}
if (GetSolutionTask != null) solution = GetSolutionTask.Result;
foreach (Project proj in solution.Projects)
{
Compilation compilation = proj.GetCompilationAsync().Result;
foreach (var tree in compilation.SyntaxTrees)
{
findMethodAndProcessIt()...
}
}
return String.Empty;
}
}
我得到的问题是没有编译有任何语法树。我通过打开其他解决方案尝试了相同的代码并且它有效。很明显,这里的问题是试图打开visual studio正在使用的解决方案。 我已经尝试在Visual Studio关闭时运行此代码,仅运行.exe,但问题仍然存在。 你对如何解决这个问题有任何想法吗?
答案 0 :(得分:0)
您正在使用MSBuildWorkspace打开解决方案。通常,当使用MSBuildWorkspace导致项目未正确加载,没有源文件等时,msbuild处理期间出现故障。这通常发生在您的应用程序在其msbuild使用的app.config文件中没有相同的绑定重定向时(在msbuild.exe.config中),这会导致某些自定义任务/扩展由于版本控制不匹配而无法加载。
您需要复制&lt; assemblyBinding&gt;部分进入你的app.config。