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

时间:2015-11-08 18:55:57

标签: c# .net roslyn

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

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

我发现的主要是github,但似乎并不清晰。其他来源似乎已经过时了。我有什么东西可以忽略吗?

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

1 个答案:

答案 0 :(得分:7)

这是一个难以回答的问题,因为你必须学习许多东西来安装罗斯林" to"重写源代码"。没有官方文档,但我已经跟踪了我的进度,因为我已经在Learn Roslyn Now了解了API。

重要主题:

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

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

Install-Package Microsoft.CodeAnalysis

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

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

例如,以下代码:

class SimpleClass
{
    public void SimpleMethod()
    {
    }
}

表示为以下语法树:

enter image description here

蓝色节点代表SyntaxNode,绿色节点代表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 - 请参阅:https://stackoverflow.com/a/30563669/300908
  2. Annotations(第235和239行)
  3. .TrackNodes()
  4. 以自下而上的方式替换节点的CSharpSyntaxRewriter。我已在blog上写过这封信。
  5. Roslyn API具有绝对庞大的表面积。您可以使用数千种公共类型和方法。一开始它可能会非常压倒性,但我发现几乎任何我想对源代码做的事情都可以通过Roslyn完成。它是一个非常强大的工具。