【问题标题】:How to install Roslyn (for use in source-code-modification)?如何安装 Roslyn(用于源代码修改)?
【发布时间】:2021-02-12 02:19:26
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你想编写一个在 Visual Studio 中工作的重构,还是一个独立的应用程序?
  • @Tamas-SonarSourceTeam 无论哪种方式。

标签: c# .net roslyn


【解决方案1】:

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

重要主题:

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

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

Install-Package Microsoft.CodeAnalysis

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

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

例如下面的代码:

class SimpleClass
{
    public void SimpleMethod()
    {
    }
}

表示为如下语法树:

蓝色节点代表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 上写过这个。

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

【讨论】:

    猜你喜欢
    • 2011-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-20
    • 1970-01-01
    相关资源
    最近更新 更多