2011-09-09 2 views
1

.NET에서 디 컴파일 된 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 키워드, 람다 & 익명 함수/대표, 새로운 async 키워드 (비동기 CTP에 도입하고 아마 C#을 5.0 존재합니다 것) ...

자동 생성 된 속성에 대한 예를 들어 발생

이제 ... c__DisplayClass26 만있는 것이 이상합니다. 어쩌면 디 컴파일러가 파에 미치지 못했을 수도 있습니다. IlSpy으로 코드를 살펴보십시오.

이 페이스트 빵을보십시오 : http://pastebin.com/pTRVyVdp (그것은 내 것이 아닙니다). c__DisplayClass의 예가 있습니다. 텍스트의 전반부에는 "원래"코드가 있고, 후반에는 디 컴파일 한 코드가 있습니다. 이 경우 클로저로 사용됩니다. 32/33 행에는 [CompilerGenerated] private sealed class <>c__DisplayClass2이 있습니다. 코드에도이 코드가 있어야합니다.

음 ... IlSpy는 조금 지나치게 좋습니다 :-) 종종 CompilerGenerated 코드에서 "원래"코드를 재구성 할 수 있습니다.

2

이것은 컴파일러에서 생성 한 클래스입니다. 이 클래스는 ReportPage 클래스의 메서드 중 익명의 대리자 또는 람다에서 만들어 졌을 가능성이 큽니다.

디 컴파일 된 코드에서 이것이 어디에서 사용되는지 확인할 수 있어야하며이를 취소하려는 작업을 파악할 수 있어야합니다.

4

xanatos가 정확합니다. 클로저 의미를 구현하기 위해 자동으로 생성 된 클래스를보고 있습니다.

는 대신에 뭔가을해야 할 때 C# 컴파일러가 생성하는 마법 이름을 해석 내 편리한 가이드는 여기에 있습니다 :

Where to learn about VS debugger 'magic names'

그러나 다시 날이에 의존해서는 안 강조하자 ; 이는 오락 목적으로 만 사용됩니다. 우리는 언제든지이 제도를 변경할 권리가 있습니다.