2015-08-23 20 views
0

我最近不得不在一個同事的代碼被反編譯時反編譯,發現它的大部分看起來非常好(謝謝ILSpy),除了我們需要使用的幾個地方的明顯例外dynamic - 這些得到了錯位成幾個部分:反編譯c#動態操作時看到的語法實際上是什麼意思?

  1. 呼叫站點容器 - 即什麼類似於定義一個類,但是我們要說,使用了其中dynamic的方法是DoStuff,本來沿public /* static? I forget */ class <DoStuff>CallSiteContainer_Plus_Some_Weirdness { /* bunch of CallSite fields */ }行的聲明
  2. 許多代碼檢查容器中的各種CallSites是否已分配並在使用前將其分配爲requi紅色使用方法我真的不知道。

我的問題是關於第一點的類聲明的語法。它看起來像一個泛型類,但它顯然不是。任何人都可以解釋那裏發生了什麼?

請注意,我並不是在尋找幫助來制定原始代碼 - 我已經設法通過審慎地使用查找和替換來實現這一點,並且將自動生成的代碼從其他所有代碼中分離出來。但是我想了解CallSite容器語法是一個有效的類名!

+0

爲了缺乏完整的代碼示例而提前道歉 - 我要求的機器沒有VS.如果我有機會,我會在本週以適當的例子更新問題。只需簡單地調用一個動態對象,然後用ILSpy反編譯該方法即可獲得相同的效果。 – tobriand

+0

從我所看到的(只是從IL代碼) - 沒有你描述的課程。 'System.Runtime.CompilerServices.CallSite.Create'只是一種允許你通過反射動態調用對象的方法的方法。也許這是'ILSpy'試圖理解它?但是從我測試過的,只有對CallSite的調用,而沒有這些生成的類。 – Rob

+0

不夠公平......所以實際上它可能只是一個推動反編譯器極限的情況。我設法在Google書籍的「C#4.0 Unleashed」示例樣本中找到對調用站點容器的引用,因此認爲它是合法的語法(但解釋僅包含在示例中)。無論如何,本週將粘貼樣本,以便其他人至少可以看到我在說什麼。 – tobriand

回答

1

這裏有這樣的自動生成的類的例子:

private static class <>o__0 
{ 
    public static CallSite<Action<CallSite, Type, object>> <>p__0; 
} 

如果你所擔心的<>o__0類名和<>p__0字段名,那麼你是對的,那些是不是有效的C#的名字,但是這並未這不意味着它們不是編譯器生成的有效IL名稱。它使用這種特殊符號的原因是爲了確保它們永遠不會與作爲開發人員可能編寫的類名衝突。