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

How to use Formatter.Format(SyntaxNode,Workspace) in roslyn?

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

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

并且在执行 MSBuildWorkspace.Create():

时抛出 IOException

Could not load file or assembly 'Microsoft.Build, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The system cannot find the file specified.

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

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

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

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

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

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

除非你真的想加载 csprojsln,否则你根本不需要 MSBuild;您可以创建一个 AdHocWorkspace、添加一个项目、添加您的语法树,然后对其进行格式化。