2013-05-13 22 views
1

這個問題的背景太複雜了,無法在這裏描述,並且可能會對響應產生不利影響,所以我不包括它。我想在單元測試中斷言某個方法的某些事情。其中一些東西可以使用反射,例如try/finally塊的格式,類字段和方法局部變量等。我已經知道類型和方法簽名。使用Reflection和CodeDom進行方法分析

protected override void OnTest() 
    { 
     bool result = false; 
     SomeCOMObject com = null; // System.__ComObject 

     try 
     { 
     } 
     finally 
     { 
      System.Runtime.InteropServices.Marshal.ReleaseComObject(com); 
     } 

     return (result); 
    } 

我一直沒能實現的東西,如:

  • 該方法是否只包含一個return (result);聲明,以及是否該聲明是在函數中的最後一個。
  • System.__ComObject類型的所有變量是否已在finally塊中使用System.Runtime.InteropServices.Marshal.ReleaseComObject(object)進行手動取消參考。

由於其中有些東西不可能使用反射,而且源代碼的文本分析還不夠理想,所以我轉向CodeDom,但一直未能掌握它。我被告知從源代碼創建表達式樹是不可能的。也不可能從運行時類型創建表達式樹。如果這是正確的,我如何利用CodeDom來實現上面列表中的內容?

我在過去使用過CodeDom進行代碼生成並將簡單的代碼類編譯爲程序集。但我不知道如何用它來分析方法的內部。請指教。

+1

您可能想要調查Roslyn CTP:http://www.microsoft.com/en-us/download/details.aspx?id=34685 – dlev 2013-05-13 17:28:08

回答

2

通常,內置於編程語言中的反射不提供對函數內容的訪問。所以你幾乎不能用反射來做到這一點。

如果您有權訪問字節碼等價物,但字節碼無法真正回答有關該方法的語法的問題,例如「存在多少返回語句返回相同的表達「。

如果您想對代碼進行推理,您需要推理源代碼。這意味着您需要訪問解析器,並且經常需要其他有用的事實(「X的聲明是什麼?」,「X和Y的類型是否兼容?」,「數據是否從X流向Y?」等)。

Roslyn提供了一些這方面的信息。也有商業解決方案(我有一個)。

+0

謝謝。我在理解CodeDom,Roslyn和其他商業解決方案是否在暴露編譯器類型和服務的同一主體上運作正確嗎?因爲我正在研究長遠的目標,所以我也有興趣知道您使用哪種解決方案。 – 2013-05-13 17:54:25

+0

我公司提供DMS Software Reengineering Toolkit,它明確地設計用於提供支持許多計算機語言的解析,名稱解析,流程分析,源代碼轉換等的服務,這取決於客戶的興趣和以前的應用程度。您對C#的具體問題(「該方法是否只包含1個返回,並且是最後一個語句?」)可以很容易地用DMS的C#AST進行回答。請參見http://www.semanticdesigns.com/Products/DMS/DMSToolkit.html – 2013-05-13 18:03:22

+0

謝謝。也許你的銷售團隊中的某人可以向我介紹產品,以及CodeCom和Roslyn之外的產品。如果是這樣,請隨時使用我的個人資料聯繫信息。 – 2013-05-13 18:20:56