这是一个很难回答的问题,因为从“安装 Roslyn”到“重写源代码”,您必须学习很多东西。没有官方文档,但我在 Learn Roslyn Now 学习 API 时一直在跟踪我的进度。
重要主题:
Roslyn 部署为 NuGet 包,您可以通过以下方式将其安装到项目中:
Install-Package Microsoft.CodeAnalysis
有关更多信息(包括有关安装帮助工具的视频),请参阅Part 1: Installing Roslyn。
对于刚接触 Roslyn 的用户来说,语法树 API 是最重要的概念。作为程序员,我们习惯于以直接操作的字符串形式处理源代码。在幕后,编译器获取这些字符串并将它们转换为树结构。
例如下面的代码:
class SimpleClass
{
public void SimpleMethod()
{
}
}
表示为如下语法树:
蓝色节点代表SyntaxNode,绿色节点代表SyntaxToken。 SyntaxNodes 是树的内部节点,可以分解成更小的部分。 SyntaxTokens 是语法树的基本单元,不能分解成更小的部分。 (你不能将{ 或public 分解成更小的东西)。
同样重要的是要注意SyntaxTree 是不可变的。这意味着我们不能直接更改树。相反,我们必须在原始树的基础上创建一个新树,但应用我们的更改。
让我们把这些放在一起并重命名一个方法:
var tree = CSharpSyntaxTree.ParseText(@"
class MyClass
{
void MyMethod()
{
}
}");
//We navigate these trees by getting the root, and then
//searching up and down the tree for the nodes we're interested in.
var root = tree.GetRoot();
var method = root.DescendantNodes().OfType<MethodDeclarationSyntax>().Single();
//Let's create a new method with a different name
var newIdentifier = SyntaxFactory.Identifier("MyNewMethodWithADifferentName");
//NOTE: We're creating a new tree, not changing the old one!
var newMethod = method.WithIdentifier(newIdentifier);
Console.WriteLine(newMethod);
在这一点上,我们实际上只是触及了表面。还有很多其他方法可以重写源代码,包括:
-
DocumentEditor - 见:https://stackoverflow.com/a/30563669/300908
-
Annotations(第 235 和 239 行)
.TrackNodes()
-
CSharpSyntaxRewriter 以自下而上的方式替换节点。我已经在我的blog 上写过这个。
Roslyn API 具有绝对巨大的表面积。有数以千计的公共类型和方法可供您使用。一开始可能会让人不知所措,但我发现几乎任何我想对源代码做的事情都可以通过 Roslyn 完成。这是一个非常强大的工具。