gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 19:56:32 27 4
gpt4 key购买 nike

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

我不想要源代码。我只想能够做一些简单的代码更改,例如 this question询问。

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

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

最佳答案

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

重要主题:

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

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

Install-Package Microsoft.CodeAnalysis

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

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

例如下面的代码:

class SimpleClass
{
public void SimpleMethod()
{
}
}

表示为如下语法树:

enter image description here

蓝色节点代表一个SyntaxNode绿色节点代表 SyntaxToken . SyntaxNodes 是树的内部节点,可以分解成更小的部分。 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 拥有绝对巨大的表面积。有数以千计的公共(public)类型和方法可供您使用。一开始可能会让人不知所措,但我发现几乎所有我想对源代码做的事情都可以通过 Roslyn 完成,这让我感到安心。这是一个非常强大的工具。

关于c# - 如何安装 Roslyn(用于源代码修改)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33597741/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com