如何在roslyn中使用Formatter.Format(SyntaxNode,Workspace)?

时间:2016-07-29 11:56:53

标签: c# compiler-construction roslyn formatter

我在我的项目中使用nuget的roslyn 1.3.2版。首先,我尝试使用这些代码来格式化我的代码:

var root = CSharpSyntaxTree.ParseText("filepath").GetRoot();
var workspace=MSBuildWorkspace.Create();
node=Formatter.Format(root,workspace);

执行MSBuildWorkspace.Create()时抛出IOException:

  

无法加载文件或程序集' Microsoft.Build,Version = 14.0.0.0,   Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'或其中一个   依赖。系统找不到指定的文件。

然后我尝试从Nuget安装BuildTools,因为这个问题说:MSBuildWorkspace.Create() throws exception

我收到很多错误,所以我将其卸载并删除所有文件。但是当我尝试调用MSBuildWorkspace.Create()时,它不会抛出IOException。我不知道它是如何工作的。

不幸的是,即使没有异常或警告或错误,在调用Formatter.Format之后,SyntaxNode仍然无法格式化。

还有一点,我可以轻松地在没有buildtools或IOException的独立控制台应用程序中格式化一些代码。他们使用相同的代码。为什么这与我的项目不相容?

那么使用它的正确方法是什么,更好的不使用BuildTools nuget包?

1 个答案:

答案 0 :(得分:1)

工作空间需要实际包含语法根(在项目中)。你不能只是传递一个空的工作区。

除非您确实要加载csprojsln,否则根本不需要MSBuild;您可以创建AdHocWorkspace,添加项目,添加语法树,然后格式化。