2011-09-09 49 views
1

我需要修復.NET 4反編譯的C#代碼。不幸的是,在我的工作站上只安裝了.NET 3.5,這可能是下面的代碼不能運行的原因編譯:C#類名前的空<>

ReportPage.<>c__DisplayClass26 <>c__DisplayClass = new ReportPage.<>c__DisplayClass26(); 

什麼<>構造意味着在這裏? 除了這一行,代碼中的任何地方都沒有c__DisplayClass26字符串。這可能意味着這個名字是由一些在反編譯過程中遺漏的元信息構成的。

+4

獲取源代碼。在大多數情況下,如果你正在反編譯的視圖進行反編譯,它*可能*不是你的代碼,你可能*不應該這樣做。 –

+0

至少找到一個C#4.0! 「Visual Studio Express」是免費的:-) – xanatos

回答

4

C#編譯器有時必須引入變量/字段/類。當他必須這樣做時,他將它們的名字前綴<>,所以不會有名稱衝突(使用C#編譯器,用這兩個字符命名某些內容是非法的)。這發生在例如自動生成的屬性,yield關鍵字,lambda &匿名函數/代理,新的async關鍵字(在異步CTP中引入的關鍵字並且可能存在於C#5.0中)...

現在...很奇怪,您只有c__DisplayClass26。也許你的反編譯器沒有達到標準。嘗試使用IlSpy查看代碼。

看看這個pastebin:http://pastebin.com/pTRVyVdp(這不是我的)。有一個例子c__DisplayClass。在文本的前半部分是「原始」代碼,後半部分是反編譯代碼。你看,在這種情況下,它用於關閉。在第32/33行,有一個[CompilerGenerated] private sealed class <>c__DisplayClass2。你的代碼中也應該包含它。

嗯... IlSpy有點太好了:-)通常它能夠重建CompilerGenerated代碼中的「原始」代碼。

2

這是一個編譯器生成的類。它很可能是由ReportPage類的方法中的匿名代理或lambda創建的。

您應該能夠看到在反編譯代碼中使用了哪些內容,並試圖弄清楚它是如何將其退出的。

4

xanatos是正確的;你正在看一個自動生成的類來實現閉包語義。

我方便的指南,解釋魔法姓名的C#編譯器生成時,它必須代表您的東西是在這裏:

Where to learn about VS debugger 'magic names'

但讓我再次強調,你不應該依賴於這個;這僅用於娛樂目的。我們保留隨時更改此計劃的權利。

相關問題