如何安装 Roslyn(用于源代码修改)?

How to install Roslyn (for use in source-code-modification)?

我不想安装编译器 - 据我所知它已经安装了。 (我使用的是 Visual Studio 2015)。

我不要源代码。我只是想能够像 this question 询问的那样做一些简单的代码更改。

我查到的主要是github,好像不太清楚。其他来源似乎已经过时了。有什么东西是我忽略的吗?

那么 - 如何获得使用 Roslyn 修改源代码所需的工具?

这是一个很难回答的问题,因为从“安装 Roslyn”到“重写源代码”,您必须学习很多东西。没有官方文档,但我一直在跟踪我的进度,因为我在 Learn Roslyn Now.

学习了 API

重要主题:

  • 正在安装 Roslyn
  • Roslyn 语法树
  • 不变性

Roslyn 作为 NuGet 包部署,您可以通过以下方式安装到项目:

Install-Package Microsoft.CodeAnalysis

有关更多信息(包括有关安装辅助工具的视频),请参阅 Part 1: Installing Roslyn

语法树 API 是 Roslyn 新用户需要理解的最重要的概念。作为程序员,我们习惯于以直接操作的字符串形式处理源代码。在幕后,编译器获取这些字符串并将它们转换为树结构。

例如下面的代码:

class SimpleClass
{
    public void SimpleMethod()
    {
    }
}

表示为如下语法树:

蓝色节点代表一个SyntaxNode and the green nodes represent a SyntaxTokenSyntaxNodes 是树的内部节点,可以分解成更小的块。 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);

在这一点上,我们真的只是触及了表面。还有很多其他方法可以重写源代码,包括:

  1. DocumentEditor - See:
  2. Annotations(第 235 和 239 行)
  3. .TrackNodes()
  4. CSharpSyntaxRewriter that replaces nodes in a bottom-up approach. I've written about this on my blog.

Roslyn API 拥有绝对巨大的表面积。有数以千计的 public 类型和方法可供您使用。一开始可能会让人不知所措,但我发现几乎所有我想对源代码做的事情都可以通过 Roslyn 完成,这让我感到安心。这是一个非常强大的工具。