我不想安装编译器 - 据我所知,它已经安装好了。 (我使用的是Visual Studio 2015)。
我不想要源代码。我只是希望能够像this question那样做一些简单的代码改变。
我发现的主要是github,但似乎并不清晰。其他来源似乎已经过时了。我有什么东西可以忽略吗?
那么 - 我如何获得使用Roslyn进行源代码修改所需的工具?
答案 0 :(得分:7)
这是一个难以回答的问题,因为你必须学习许多东西来安装罗斯林" to"重写源代码"。没有官方文档,但我已经跟踪了我的进度,因为我已经在Learn Roslyn Now了解了API。
重要主题:
Roslyn被部署为NuGet包,您可以通过以下方式安装到项目中:
Install-Package Microsoft.CodeAnalysis
有关更多内容(包括有关安装帮助工具的视频),请参阅Part 1: Installing Roslyn。
语法树API是了解Roslyn新用户最重要的概念。作为程序员,我们习惯于以直接操作的字符串形式处理源代码。在幕后,编译器接受这些字符串并将它们转换为树结构。
例如,以下代码:
class SimpleClass
{
public void SimpleMethod()
{
}
}
表示为以下语法树:
蓝色节点代表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);
在这一点上,我们真的只是触及了表面。还有其他一些方法可以重写源代码,包括:
DocumentEditor
- 请参阅:https://stackoverflow.com/a/30563669/300908 Annotations
(第235和239行).TrackNodes()
CSharpSyntaxRewriter
。我已在blog上写过这封信。 Roslyn API具有绝对庞大的表面积。您可以使用数千种公共类型和方法。一开始它可能会非常压倒性,但我发现几乎任何我想对源代码做的事情都可以通过Roslyn完成。它是一个非常强大的工具。