如何安装 Roslyn(用于源代码修改)?
How to install Roslyn (for use in source-code-modification)?
我不想安装编译器 - 据我所知它已经安装了。 (我使用的是 Visual Studio 2015)。
我不要源代码。我只是想能够像 this question 询问的那样做一些简单的代码更改。
我查到的主要是github,好像不太清楚。其他来源似乎已经过时了。有什么东西是我忽略的吗?
那么 - 如何获得使用 Roslyn 修改源代码所需的工具?
这是一个很难回答的问题,因为从“安装 Roslyn”到“重写源代码”,您必须学习很多东西。没有官方文档,但我一直在跟踪我的进度,因为我在 Learn Roslyn Now.
学习了 API
重要主题:
- 正在安装 Roslyn
- Roslyn 语法树
- 不变性
Roslyn 作为 NuGet 包部署,您可以通过以下方式安装到项目:
Install-Package Microsoft.CodeAnalysis
有关更多信息(包括有关安装辅助工具的视频),请参阅 Part 1: Installing Roslyn。
语法树 API 是 Roslyn 新用户需要理解的最重要的概念。作为程序员,我们习惯于以直接操作的字符串形式处理源代码。在幕后,编译器获取这些字符串并将它们转换为树结构。
例如下面的代码:
class SimpleClass
{
public void SimpleMethod()
{
}
}
表示为如下语法树:
蓝色节点代表一个SyntaxNode
and the green nodes represent a 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);
在这一点上,我们真的只是触及了表面。还有很多其他方法可以重写源代码,包括:
DocumentEditor
- See:
Annotations
(第 235 和 239 行)
.TrackNodes()
-
CSharpSyntaxRewriter
that replaces nodes in a bottom-up approach. I've written about this on my blog.
Roslyn API 拥有绝对巨大的表面积。有数以千计的 public 类型和方法可供您使用。一开始可能会让人不知所措,但我发现几乎所有我想对源代码做的事情都可以通过 Roslyn 完成,这让我感到安心。这是一个非常强大的工具。
我不想安装编译器 - 据我所知它已经安装了。 (我使用的是 Visual Studio 2015)。
我不要源代码。我只是想能够像 this question 询问的那样做一些简单的代码更改。
我查到的主要是github,好像不太清楚。其他来源似乎已经过时了。有什么东西是我忽略的吗?
那么 - 如何获得使用 Roslyn 修改源代码所需的工具?
这是一个很难回答的问题,因为从“安装 Roslyn”到“重写源代码”,您必须学习很多东西。没有官方文档,但我一直在跟踪我的进度,因为我在 Learn Roslyn Now.
学习了 API重要主题:
- 正在安装 Roslyn
- Roslyn 语法树
- 不变性
Roslyn 作为 NuGet 包部署,您可以通过以下方式安装到项目:
Install-Package Microsoft.CodeAnalysis
有关更多信息(包括有关安装辅助工具的视频),请参阅 Part 1: Installing Roslyn。
语法树 API 是 Roslyn 新用户需要理解的最重要的概念。作为程序员,我们习惯于以直接操作的字符串形式处理源代码。在幕后,编译器获取这些字符串并将它们转换为树结构。
例如下面的代码:
class SimpleClass
{
public void SimpleMethod()
{
}
}
表示为如下语法树:
蓝色节点代表一个SyntaxNode
and the green nodes represent a 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);
在这一点上,我们真的只是触及了表面。还有很多其他方法可以重写源代码,包括:
DocumentEditor
- See:Annotations
(第 235 和 239 行).TrackNodes()
-
CSharpSyntaxRewriter
that replaces nodes in a bottom-up approach. I've written about this on my blog.
Roslyn API 拥有绝对巨大的表面积。有数以千计的 public 类型和方法可供您使用。一开始可能会让人不知所措,但我发现几乎所有我想对源代码做的事情都可以通过 Roslyn 完成,这让我感到安心。这是一个非常强大的工具。