2010-06-15 34 views
7

我正在尋找一種方法來通過反射過濾掉具有unsafe修改器的方法。它似乎不是一個方法屬性。通過反射確定方法是否不安全

有沒有辦法?

編輯:似乎這個信息不在元數據中,至少我不能在IL中看到它。但是,反射器在C#視圖中顯示unsafe修改器。有關如何完成的任何想法?

編輯2:對於我的要求,我結束了一個檢查,即假定如果該方法的參數之一是一個指針,或返回類型是一個指針,則該方法是不安全的。

public static bool IsUnsafe(this MethodInfo methodInfo) 
    { 
     if (HasUnsafeParameters(methodInfo)) 
     { 
      return true; 
     } 

     return methodInfo.ReturnType.IsPointer; 
    } 

    private static bool HasUnsafeParameters(MethodBase methodBase) 
    { 
     var parameters = methodBase.GetParameters(); 
     bool hasUnsafe = parameters.Any(p => p.ParameterType.IsPointer); 

     return hasUnsafe; 
    } 

這不處理,當然,這裏不安全塊的方法內執行,但同樣的情況,所有我感興趣的是方法簽名。

謝謝!

+0

想要這樣做的原因是什麼?也許有另一種選擇。 – GenericTypeTea 2010-06-15 11:30:16

+0

@GenericTypeTea我正在通過CodeDom做一些代碼生成。它不支持生成'unsafe'關鍵字,所以我想忽略具有'unsafe'方法的類型。 – 2010-06-15 11:32:11

+0

我猜unsafe關鍵字只是一個標誌,告訴編譯器:不要在這裏生成編譯錯誤,因爲我打算使用不安全的代碼。反射器可能檢測到不安全的代碼,然後添加關鍵字。我注意到,如果在「安全」方法中使用不安全的塊,則反射器中的不安全關鍵字將在方法聲明中生成,因此它不會爲其生成塊。 所以這裏的答案是:如果Reflector可以檢測到mscorlib中的不安全代碼,您也可以... – Koen 2010-06-15 12:27:33

回答

4

不幸的是,不安全的關鍵字只是簡單地將方法的主體封裝在不安全的塊中,不會發射任何反射會看到的東西。要確定的唯一方法是拆解該方法,並查看是否存在任何不安全的操作。

+0

我也認爲,如果你可以用反射看到它,他們將有一個屬性給我們MethodInfo ... – Koen 2010-06-15 11:55:10

+1

它會很好,但不幸的是,不安全的關鍵字是C#的東西,而不是IL的東西。 IL有不安全的操作,但沒有不安全關鍵字的概念。 – 2010-06-15 21:17:01

+0

謝謝你,亞當。我接受了這個答案,因爲這是我達成的結論。 – 2010-06-16 07:08:28

0

不要以爲有開箱即用的方法。如果您反映的代碼是您的代碼,您可以創建自己的UnsafeAttribute,並使用該屬性和過濾器標記這些方法...

+0

謝謝,但我實際上試圖過濾我們的'mscorlib'類型... – 2010-06-15 11:19:26

2

這就是IL驗證者的工作。 PEVerify.exe在Windows SDK的bin目錄中。它驗證方法體中的IL並標記不安全的IL。指針,主要是。如果你在system.dll程序集中放鬆它,你會得到一個相當大的列表。

請注意,它拒絕驗證mscorlib.dll,如果這是你關心的那個,你就會陷入困境。複製和重命名不起作用。