2011-03-04 103 views
1

我想弄清楚,如果它通過反射可能(或其他方式),以「審計」一些代碼來執行驗證要求 - 如檢查是否代碼創建的所有線程(的System.Threading .Thread)或使用其他BCL。假設是代碼已經編譯成一個dll。謝謝!C#反射和審計類型

+0

大家反饋很好,謝謝! – user644107 2011-03-04 17:16:05

+0

我試過fxcop,但需要無人看管的安裝,所以最終使用憲兵,這已經很好(除了1次要的事情,我會問一個後續問題。)感謝提示! – user644107 2011-03-06 04:00:21

回答

0

反思不允許體成員的檢查,只有他們的簽名。換句話說,它不會告訴你什麼特定的方法或屬性確實是,它看起來像什麼。

要做你正在做的事情,你必須使用類似ildasm.exe的東西來將編譯好的.dll或.exe文件轉換爲IL文件,然後再通過IL文件,看看它是否在做任何你反對的東西。

2

看看FxCop。它可以加載編譯後的二進制文件(dll或exe),並對編譯後的IL執行驗證和合規性檢查,而不管用於編寫它的.NET語言。

你可以寫自己的規則 - 你會在這種情況下,做趕上「=新的Thread()」之類的情況。

1

正如其他人所說反射不會幫助你,因爲它只描述了tpyes的元數據。

然而,Mono.Ceci升項目是一個組件內實際的類型看IL(中間語言)的運行時的方式。雖然Mono框架的產品與Microsoft CLR兼容。

2

如果你非常熟悉IL,你可以用反射來做到這一點。

MethodBody mb = this.GetType().GetMethod("Method", BindingFlags.Default).GetMethodBody(); 
    byte[] bytes = mb.GetILAsByteArray(); 

可能更麻煩的方式比它值得;得到的IL將需要被解析。

一個IL語法分析器(但有些過時):http://www.codeproject.com/KB/cs/sdilreader.aspx它將爲您生成一個OpCodes列表(查找用於實例化Thread的OpCodes.Newobj)。

0

反射將允許您通過MethodBase.GetMethodBody檢查方法的身體,給你一個MethodBody檢查。

然而,在這個水平,你在一個字節數組處理生IL,你必須分析開始到結束,以找出外部方法調用和他們做了什麼等

,所以它不會相當或簡單,但肯定有可能。