2009-03-05 136 views
3

我想能够解析vb.net代码文件,因此我可以检查Subs,函数(及其内容,包括注释)的集合,私人变量等.Net字符串解析库或正则表达式解析.Net代码文件

可以打开实际的源代码文件。

因此,举例来说,如果我有:

Public Function FunctionOne(arg1 As String, arg2 as String) as Integer 
    here is some code 
    ''//here are some comments 
End Function 

Public Sub FunctionOne(arg1 As integer, arg2 as integer) 
    here is some code 
    ''//here are some comments 
End Sub 

我希望能够解析出所有的潜艇和功能,所有的公共Function和End Function(实际的代码,它会是不错的选择要么只包括​​内部的代码,或整个函数定义。

这似乎要求某种解析库,否则还算过得去的正则表达式的技能。

任何建议?

更新: 我试图实现的主要目的是解析源代码,所以反射也许很好,可能是为了获取函数列表,而不是,我知道该怎么做,但它是正确解析源代码我想弄清楚。

+0

伟大的问题。这是我一直在C#领域寻找的东西,但除了SharpDevelop以外,目前还没有运气。祝你好运! – 2009-03-05 17:45:23

回答

1

此代码是原油,但或多或​​少地完成我是什么打算做:

Private _SourceCode As String = Nothing 
Private ReadOnly Property SourceCode() As String 
       Get 
        If _SourceCode = Nothing Then 
         Dim thisCodeFile As String = Server.MapPath("~").ToString & "\" & Type.GetType(Me.GetType.BaseType.FullName).ToString & ".aspx.vb" 
         _SourceCode = My.Computer.FileSystem.ReadAllText(thisCodeFile) 
        End If 
        Return _SourceCode 
       End Get 
End Property 

Private Function extractProcedureDefinition(ByVal procedureName As String) As String 
    Return extractStringContents(Me.SourceCode, "Sub " & procedureName & "()", "End Sub", True) 
End Function 

Private Function extractFunctionDefinition(ByVal procedureName As String) As String 
    'TODO: This works now, but wouldn't if we wanted includeTags = False, as it does not properly handle the "As xxxxx" portion 
    Return extractStringContents(Me.SourceCode, "Function " & procedureName, "End Sub", True) 
End Function 

    Private Function extractStringContents(ByVal body As String, ByVal openTag As String, ByVal closeTag As String, ByVal includeTags As Boolean) As String 
       Dim iStart As Integer = body.IndexOf(openTag) 
       Dim iEnd As Integer = body.IndexOf(closeTag, iStart) 
       If includeTags Then 
        iEnd += closeTag.Length 
       Else 
        iStart += openTag.Length 
       End If 
       Return body.Substring(iStart, iEnd - iStart) 
    End Function 
6

如何在程序运行时编译它们,然后在编译的库上使用反射?

看看this microsoft thread关于如何做到这一点的细节!

+0

我认为这是一个整洁的想法。谁比编译器更好地解析代码? – 2009-03-05 17:32:05

0

我想你正在寻找Microsoft.CSharp.CSharpCodeProvider,它接受一个文件并提供对C#代码生成器和编译器的直接访问。我想它也可以接受一个字符串。

MSDN:http://msdn.microsoft.com/en-us/library/microsoft.csharp.csharpcodeprovider.aspx

编辑:

的问题进行了更新后,我看到,这是不相关的,但它仍然有可能利用此对象从公众中提取源代码像你想要的方法。我将调查更多一些......

0

你可以编译这个东西,然后使用Reflector工具。我们都认为Reflector主要是一个GUI工具,它具有的一个很好的功能就是可以解编.NET组件。它可以从DLL或EXE生成源代码。但反射器本身可以通过编程控制。所以,你的应用程序可以

  • 编译源到组装
  • 呼叫到反射器,要求它去编译
  • 编程拨弄反射器的输出 - 获得的功能列表,以及相关的反编译源相同。

Example

此方法可能不满足 - 因为您从Reflector获得的源不是原始源,而是反汇编源。评论将会消失,反编译不是100%忠于原文。在功能上等同但不是100%的文本相同。

无论如何,值得一看。

3

您应该使用SharpDevelop附带的NRefactory库。

这个库允许你解析VB或C#文件。它主要用于code converter,但也可用于代码分析(这就是我们公司的做法)。

有了这个代码:

Imports System 

Class MainClass 
    Public Function FunctionOne(arg1 As String, arg2 As String) As Integer 
    Return Int32.Parse(arg1) + Int32.Parse(arg2) 
    End Function 

    Public Sub FunctionOne(arg1 As Integer, arg2 As Integer) 
    Return 
    End Sub 

End Class 

你可以得到这种结果(我用这里的NRefactoryDe​​mo应用程序) alt text http://img15.imageshack.us/img15/3564/stackoverflownrefactory.png

1

madgnome对我来说是正确的一毛钱! 我想解析C#代码并确定名称空间,类,成员和程序集之间的关系。 NRefactory和NRefactoryDe​​mo应用程序正是我需要解决这个问题的,而且开始非常容易!

非常感谢!