使用Microsoft Roslyn提取C#和VB.NET源代码中的字符串常量

网友投稿 303 2022-08-15

使用Microsoft Roslyn提取C#和VB.NET源代码中的字符串常量

Microsoft Roslyn是微软.NET“编译器即服务(Compiler as a Service)”的主要产品,它提供了开放的编译器API,并为源代码产生、分析和重构提供了新一代的语言对象模型。Anders Hejlsberg在BUILD 2013大会上提到,C# 6.0的编译器将使用Roslyn实现,这一实现会包含在Visual Studio 2013之后的产品中。根据Anders的描述,C# 6.0的编译器将采用C#开发,从而告别现有的本机代码(native code)的实现方式,“虽然是采用C#来实现C#编译器,但我想性能至少不会比原来的实现方式差。”

有关Roslyn的内容,可以参考以下链接:

Microsoft Roslyn CTP

The Roslyn Project

Anders Hejlsberg Q&A: TypeScript, C#, Roslyn, and More

让我们先睹为快,了解一下Roslyn的一个具体应用:提取C#和VB.NET代码中的字符串常量。

字符串常量的提取

先看下面的一段代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

using System;

using System.Collections;

using System.Linq;

using System.Text;

 

namespace HelloWorld

{

    class Program

    {

        static void Main(string[] args)

        {

            // Output a "greeting" string

            Console.WriteLine("Hello, World!");

            // Output another "say hello" string

            Console.WriteLine("Hi, nice to meet you!");

        }

    }

}

很明显这段代码中有四个字符串:greeting、Hello, World!、say hello和Hi, nice to meet you!,或许我们可以通过正则表达式来提取这些字符串,但请注意:这些字符串中有两个是在注释语句中出现的,而不是我们所需要的字符串常量。我们只需要得到其中真正用于可执行代码的Hello, World!和Hi, nice to meet you!,这如果通过正则表达式来区分还是有一定难度的,而且对于字符串中的转义字符等特殊字符的判断和提取,正则表达式也略显麻烦。

现在,让我们用Roslyn来完成这一工作。首先,打开Visual Studio 2012/2013,新建一个控制台程序(Console Application),.NET Framework的版本选用4.5或者4.5.1。然后,在新建的控制台程序项目上单击右键,选择Manage NuGet Packages菜单项(注意:.NET Framework的版本必须是4.5以上):

在打开的对话框中,搜索Roslyn,并将Roslyn安装到项目中:

首先创建一个语法树的访问者,它继承于Roslyn.Compilers.CSharp.SyntaxWalker,用于遍历访问C#的语法树,它的实现如下:

1

2

3

4

5

6

7

8

9

10

11

12

class ExtractStringLiteralVisitor : SyntaxWalker

{

    readonly List literals = new List();

    public override void VisitLiteralExpression(LiteralExpressionSyntax node)

    {

        if (node.Kind == SyntaxKind.StringLiteralExpression)

            literals.Add(node.ToString());

        base.VisitLiteralExpression(node);

    }

 

    public IEnumerable Literals { get { return literals; } }

}

共2页: 上一页12下一页

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:分享自制的C#和VB Code互转工具(分享自制的小零食朋友圈说说)
下一篇:【asp.net core 系列】2 控制器与路由的恩怨情仇(aspnet母版页样式)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~