繁体   English   中英

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

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

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

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

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

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

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

重要话题:

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

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

Install-Package Microsoft.CodeAnalysis

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

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

例如,以下代码:

class SimpleClass
{
    public void SimpleMethod()
    {
    }
}

表示为以下语法树:

在此处输入图片说明

蓝色节点代表SyntaxNode ,绿色节点代表SyntaxToken SyntaxNodes是树的内部节点,可以分解成更小的部分。 SyntaxTokens是语法树的基本单元, 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 我已经在我的博客上写过这方面的内容。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM