我希望能够解析vb.net代码文件,因此我可以检查Subs,Functions(及其内容,包括注释),私有变量等的集合。
我可以打开实际的源代码文件。
例如,如果我有:
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
我希望能够解析所有子函数和公共函数与结束函数之间的所有代码(实际上,选择要么只包含其中的代码,或者整个功能定义。
这似乎需要某种解析库,或者相当不错的正则表达式技能。
有什么建议吗?
更新: 我想要实现的主要内容是解析源代码,因此反射很好,可能是为了获取函数列表,什么不是,我知道如何做到这一点,但它是的正确方法解析源代码我想弄清楚。
答案 0 :(得分:6)
如何在运行时从程序中编译它们,然后在编译的库中使用反射?
查看this microsoft thread有关如何执行此操作的详细信息!
答案 1 :(得分: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
你可以得到这种结果(我在这里使用过NRefactoryDemo应用程序) alt text http://img15.imageshack.us/img15/3564/stackoverflownrefactory.png
答案 2 :(得分:1)
我认为你可以使用Visual Basic.NET Lexical Grammar和解析器生成器,如Flex和Bison(在C / C ++中)或类似Antlr(对于.NET)
这就是编译器解析语言以完成工作的方式。
答案 3 :(得分: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
答案 4 :(得分:1)
非常感谢!
答案 5 :(得分:0)
我认为您正在寻找Microsoft.CSharp.CSharpCodeProvider
,它接受一个文件并提供对C#代码生成器和编译器的直接访问。我想它也可以接受一个字符串。
MSDN:http://msdn.microsoft.com/en-us/library/microsoft.csharp.csharpcodeprovider.aspx
修改强>
问题更新后,我发现这不相关,但仍有可能利用此对象从公共方法中提取源代码,如您所愿。我会再调查一下......
答案 6 :(得分:0)
您可以编译该东西,然后使用Reflector工具。我们都认为Reflector主要是一个GUI工具,它具有的一个简洁功能是它可以解编译.NET程序集。它可以从DLL或EXE生成源。但是Reflector本身可以通过编程方式进行控制。所以你的应用可以
这种方法可能不满足 - 因为从Reflector获得的源不是原始源,而是解编译源。评论将消失,反编译不是100%忠实于原文。功能相当但不是100%在文本上相同。
无论如何,值得一看。