2009-03-05 184 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應用程序正是我需要解決這個問題的,而且開始非常容易!

非常感謝!