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

isp*_*iro 2 .net c# roslyn

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

我不想要源代码.我只是希望能够像这个问题那样做一些简单的代码改变.

我发现的主要是github似乎并不清楚.其他来源似乎已经过时了.我有什么东西可以俯瞰吗?

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

Jos*_*rty 7

这是一个难以回答的问题,因为你必须学习从"安装Roslyn"到"重写源代码"的一些事情.没有官方文档,但我已经在Learn Roslyn Now中学习了API,因此我一直在跟踪我的进度.

重要主题:

  • 安装Roslyn
  • 罗斯林语法树
  • 不变性

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

Install-Package Microsoft.CodeAnalysis
Run Code Online (Sandbox Code Playgroud)

有关更多信息(包括有关安装帮助程序工具的视频),请参阅第1部分:安装Roslyn.

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

例如,以下代码:

class SimpleClass
{
    public void SimpleMethod()
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

表示为以下语法树:

在此输入图像描述

蓝色节点表示a SyntaxNode,绿色节点表示a SyntaxToken.SyntaxNodes是树的内部节点,可以分解成更小的部分.SyntaxTokens是语法树的基本单位,不能分解成更小的部分.(你不能破坏{public变成更小的东西).

注意a 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);
Run Code Online (Sandbox Code Playgroud)

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

  1. DocumentEditor-参见:/sf/answers/2139456861/
  2. Annotations (第235和239行)
  3. .TrackNodes()
  4. CSharpSyntaxRewriter,在一个自下而上的方法代替节点.我在博客上写过这篇文章.

Roslyn API具有绝对巨大的表面积.您可以使用数千种公共类型和方法.一开始它可能非常压倒性,但我发现几乎任何我想对源代码做的事情都可以通过Roslyn完成.这是一个非常强大的工具.