Reflector의 기능을 살펴보는 마지막 장으로 오늘은 Reflector의 리소스 분석 기능과 함께 5.x 버전부터 대폭 강화된 서드파티 플러그인들을 살펴보도록 하겠습니다. 닷넷 프레임워크 기반의 응용프로그램에서 리소스는 두 가지로 구분되는데, 하나는 기존의 Win32 리소스를 뜻하며 또 하나는 .NET Framework 전용 XML 리소스를 의미합니다.

Reflector가 인식하고 보여줄 수 있는 리소스는 .NET Framework 전용 XML 리소스 및 XML 리소스와 연결된 각종 데이터 파일들입니다. 닷넷 기반 프로그램이 가지고 있는 Win32 리소스를 보기 위해서는 우리가 종전에 알고 있던 방법을 그대로 사용할 수 있습니다. 즉, VIsual Studio .NET 버전의 IDE를 이용하여 해당 바이너리를 열거나 eXeScope, Resource Hacker 등의 유틸리티를 그대로 이용할 수 있습니다.

그리고 Reflector는 이미 컴파일되고 병합된 리소스를 역추적하는 기능만을 제공합니다. Visual Studio 외에 더 전문적인 컴파일 전의 XML Resource 편집기를 찾으신다면 Resourcer를 Lutz Roeder의 웹 사이트에서 같이 다운로드받으실 수 있습니다.

http://www.aisto.com/roeder/dotnet/Download.aspx?File=Resourcer

사용자 삽입 이미지

어셈블리 노드 밑의 자식 노드에 모듈 노드와 Resources 폴더 노드가 있습니다. 여기서 Resource 폴더 노드를 펼치면 이 어셈블리에 포함된 파일과 컴파일된 리소스 스크립트 파일을 보실 수 있습니다. mscorlib은 다국어 지원을 위해서 인코딩 테이블들을 리소스로 포함하고 있군요. 그리고 mscorlib.resources가 각종 메시지를 저장해놓은 테이블인듯 싶군요.

위에서 특정 항목을 더블 클릭하거나 Space 키를 누르면 데이터를 표시하게 됩니다. 분류할 수 없는 유형의 파일이면 자동으로 바이너리 뷰어가 열리게 되며, 지원되는 그림 파일 형식이면 그림을, 텍스트 파일이면 텍스트를, .resources 파일이면 이 파일의 내용을 출력해 주는 리스트 - 디테일 뷰를 보여줍니다.

그리고 리소스를 추출하고 싶을 때에는 해당 리소스 항목 위에서 오른쪽 버튼을 클릭하고 다음과 같이 메뉴를 선택하거나 - 또는 - 키보드의 F12키를 누릅니다.

사용자 삽입 이미지

이제 Reflector의 기본적인 기능들은 모두 살펴보았습니다. 하지만 Reflector를 더욱 강력하게 해 줄 플러그인들을 살펴보도록 하겠습니다. 이 문서를 작성하는 현재, Reflector 5.x 버전 이후부터는 Microsoft의 오픈 소스 프로젝트 호스팅 사이트인 Codeplex.com에 플러그인 컬렉션이 개설되어 품질높은 Reflector 플러그인들을 다운로드받을 수 있게 되었습니다.

http://www.codeplex.com/reflectoraddins

플러그 인을 하나 받았다면 플러그 인을 설치하기 위하여 보통 다음의 방법을 이용할 수 있습니다. 만약 플러그 인 자체에 내장 설치 프로그램이 있다면 이 프로그램을 직접 이용하여도 됩니다.

사용자 삽입 이미지
웹 사이트에서 플러그 인을 다운로드받았을 때 DLL 파일이 한 개 - 또는 - 여러 개가 있다면 이 파일들을 찾기 쉬운 위치에 일단 저장하시면 됩니다. 그 다음에는 Reflector에서 View 메뉴를 클릭하고 옆의 메뉴처럼 항목을 선택하면 됩니다.

그 다음에는 아래와 같은 대화 상자가 나타나는데 여기서 Add버튼을 클릭하고 해당 플러그 인 DLL이 저장된 디렉터리를 지정하여 주시면 됩니다. 플러그 인을 등록한 후에 플러그 인을 사용하는 방법에 대해서는 플러그 인을 다운로드할 때 제공되었던 매뉴얼, 웹 사이트의 설명, 플러그 인 안의 자체 도움말을 참고하여야 합니다.

사용자 삽입 이미지

그리고 몇 가지 주목할만한 플러그인들이 있습니다. 꼭 설치하여 활용해 보시기를 권합니다.

사용자 삽입 이미지
Code Model Viewer: MSIL 어셈블리 수준의 코드 모델에 따라 내용을 보여주는 확장 플러그 인으로 MSIL의 내용을 도식화하기에 매우 유리합니다.

사용자 삽입 이미지
COM Loader: 시스템에 등록된 모든 COM 컴포넌트들을 대상으로하는 유틸리티이며 이 유틸리티로 특정 COM 컴포넌트를 .NET Framework 어셈블리로 변환하여 해당 어셈블리를 Reflector로 가져옵니다. 이 플러그인은 플랫폼 호출 기능을 사용하여 프로그램을 개발할 때 유용하게 사용 할 수 있습니다.
사용자 삽입 이미지


C++ CIL Language: Reflector가 현재 제공하는 MC++은 .NET Framework 버전 1.0 및 1.1을 대상으로 한 것입니다. 최근에 발표된 Visual C++ 8.0의 MC++ 확장 문법으로 디스어셈블한 결과를 보기 원한다면 이 플러그인을 활용하면 됩니다.
사용자 삽입 이미지


Deblector: Reflector를 Debugger 처럼 사용할 수 있게 해주며 동시에 프로세스 연결 기능 등을 구현해 주어 디버깅 작업을 간편하게 만들어주는 유틸리티입니다.

사용자 삽입 이미지

Diff: 서로 다른 버전의 어셈블리를 MSIL 수준에서 비교하는 유틸리티입니다. 이 유틸리티를 이용하면 이미 컴파일된 어셈블리들 사이의 차이점을 조사하거나 문제를 분석하는 데에 도움이 될 수 있습니다.

사용자 삽입 이미지
Graph: 어셈블리 내의 클래스들 사이의 관계를 그래프로 도식화하여 출력하는 플러그인으로 현재는 UML과 관련이 없습니다만 향후 이 플러그인을 업그레이드하는 방향 - 또는 - 새로운 UML 플러그인이 등장할 것으로 기대됩니다.

사용자 삽입 이미지
SQL 2005 Browser: Microsoft SQL Server 2005부터 새로 지원되는 기능인 .NET Framework를 이용한 SQL 서버 확장 프로시저 및 플러그인 개발에 맞춘 기능이며 이 플러그인을 사용하면 특정 SQL Server 2005 서버에 접속하여 저장된 .NET 어셈블리를 가져올 수 있습니다.

Reflector 강좌는 여기까지로 합니다. Reflector 플러그 인을 직접 개발하거나 활용하길 원하면 오픈 소스로 공개된 다른 플러그 인의 웹 사이트나 소스 코드를 참고하시면 되겠습니다.
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Windows Azure MVP 남정현 (rkttu.com)
지난번 강좌에 이어서 디스어셈블 기능과 분석 기능을 살펴보기로 합니다. Reflector가 인기있는 이유는 사실 강력한 내장 디스어셈블러 때문입니다. 디스어셈블링 작업은 소스 코드를 역으로 되가져올 수 있다는 것을 의미하는데 이것은 양날의 칼과 같습니다. 어떻게 쓰느냐에 따라서 유용할 수도 있지만 아주 치명적일 수 있습니다.

디스어셈블러로 Base Class Library의 버그를 찾은 사례가 있습니다. 바로 System.Windows.Forms.WebBrowser 클래스에서 "덜 구현된" 프로퍼티의 문제점을 찾을 수 있었는데 HTML 문서가 저장된 스트림을 이 클래스의 어떤 프로퍼티에 넘기면 무조건 서유럽언어의 인코딩으로만 처리하려는 문제점이었습니다. 이 문제를 파악한 이후부터는 이 프로퍼티를 직접 사용하지 않고 Document Object Model 객체를 직접 가져와서 접근하는 방식을 이용하기 시작하였습니다. (이 클래스의 프로퍼티들 중에서 Dom~이라는 접두어가 붙는 프로퍼티들이 Internet Explorer의 COM 객체를 직접 노출하는 프로퍼티들입니다.)

하지만 디스어셈블러를 사용하기에 따라서는 소스 코드의 취약점을 파악하거나 소스 코드의 저작권을 보호할 수 없게된다는 문제도 같이 안고 있습니다. 그래서 나온 것이 Obfuscation, 즉 코드 난독화 기술입니다. 다행히 Reflector는 코드 난독화 기술을 정복하면서까지 디스어셈블을 시도하는 해킹 도구는 아니기 때문에 코드 난독화 기술이 적용된 어셈블리에 대해서는 "잘못된 결과"를 나타내거나 작업 자체를 실패로 처리합니다.

디스어셈블러를 이용하여 다른 어셈블리를 살펴볼 때에는 주의할 점이 있습니다. 디스어셈블러로 얻어진 결과는 어디까지나 기술적인 진단을 위한 목적으로서 "개인적"으로 사용하여야 합니다. 이러한 결과를 상업적으로 재구성하여 판매하거나 무단으로 공개하는 경우 저작권 분쟁이나 EULA 계약 위반에 대한 법적 조치에 놓일 수 있습니다. 일반적으로 EULA 계약에는 디스어셈블에 대한 금지 조약이 포함되어있기 때문입니다. 그리고 디스어셈블한 내용을 특정 언어의 문법에 맞게 재구성하는 기능을 너무 신뢰하지는 마십시오.

서두가 좀 길었습니다만 충분히 이야기하고 넘어가야 할 부분들이었으니 숙지해주시길 바랍니다. 이제 Reflector를 이용하여 Base Class Library를 한 번 분석해 보도록 하겠습니다.

"그림 펼치기" 버튼을 눌러서 핵심 라이브러리의 System 네임스페이스 안에는 무엇이 들어있는지 쭉 살펴봅시다.

그림 펼치기

간간히 전에는 보이지 않았던 낯설은 이름들이 보입니다. __Canon, __ComObject, MDA와 같은 것들인데, 이것들은 공식적으로 문서화되지 않은 내부 클래스입니다. 접근 제한자는 internal이 주로 많을 것이고 중첩 형식의 경우 private, protected, internal 중 하나일 수 있습니다.

Reflector를 이용하면 이와 같이 밖으로 드러나지 않는 형식들도 쉽게 파악할 수 있습니다. 우리가 지금 살펴볼 디스어셈블 기능 역시 밖으로 드러나는 형식이든 아니든 상관없이 작동합니다.

위의 그림에서처럼 트리를 확장한 상태에서 Object 클래스를 찾아서 이름 앞의 "+" 기호를 클릭하면 다음 그림과 같이 됩니다.

사용자 삽입 이미지
Object 클래스 안에도 전에는 보이지 않았던 숨겨진 멤버들을 보실 수 있습니다. 특히 재미있는 부분은 Equals, GetHashCode, GetType과 같은 기본 멤버 메서드들입니다. 이 메서드들을 디스어셈블링하기 위하여 위의 트리뷰에서 Object 클래스의 노드를 펼치면 됩니다. 그리고 해당 멤버 위에서 Space 키를 누르면 디스어셈블러가 작동하여 특정 언어로 변환된 결과를 트리뷰 왼쪽편에 크게 펼쳐서 나타냅니다.

막상 살펴보면 이들 메서드들은 MSIL로 구현된 것이 아니라는 걸 알 수 있는데 다음과 같습니다.

사용자 삽입 이미지

사용자 삽입 이미지

Equals 메서드를 디스어셈블링한 결과를 보면 InternalEquals라는 메서드를 호출한 것을 볼 수 있습니다. 그런데 이 메서드는 우리가 알고 있는 플랫폼 호출 메서드와는 다른 양상을 띄고있는데 MethodImplAttribute만이 지정되어있습니다. 이것의 실제 구현은 .NET Framework 안에 숨겨져 있다는 것을 뜻합니다. 재미있는 사실은 성능과 관련이 깊거나 혹은 사용 빈도가 높은 유형의 기능들은 모두 이와 같은 방식으로 처리된다는 점입니다.

GetType 메서드, GetHashCode 메서드 등은 또 어떻게 구성되어있는지 살펴보도록 하겠습니다.

사용자 삽입 이미지

GetType 메서드는 실제로 위와 같습니다.

사용자 삽입 이미지
사용자 삽입 이미지

그리고 GetHashCode 역시도 Equals 메서드와 같은 방식으로 구현된 것을 볼 수 있습니다.

대강 이와 같은 방법으로 디스어셈블링할 수 있습니다. 만약 평소에 내부 구현이 어떻게 되어있는지 궁금했던 클래스나 형식이 있다면 Reflector에서 열어서 보십시오. 해답이 보이실 겁니다. 그리고 만약 어떤 어셈블리를 여는 도중이거나 특정 멤버를 탐색하려고 할 때 다음과 같은 대화 상자가 나타날 수 있습니다.

사용자 삽입 이미지

현재 Reflector가 로드한 어셈블리들 중에서 관련된 어셈블리가 없으면 GAC를 조사하여 일치하는 어셈블리를 자동으로 추천하는 대화 상자가 위와 같이 나타나게 됩니다. 대개의 경우 저 대화 상자에서 추천하는 내용이 정확하지만 그렇지 않은 경우도 있습니다.

Reflector의 디스어셈블러가 지원하는 재미있는 기능을 또 하나 더 살펴보기로 합시다. 지금까지 본 언어는 C#이 전부인데, C# 말고 다른 언어로도 디스어셈블링 결과를 볼 수 있습니다. 좀 더 복잡한 형식을 이용하여 결과를 살펴보기로 합니다. 살펴보려는 멤버는 System.Environment 클래스의 GetEnvironmentVariable 정적 메서드입니다.

MSIL Version Open

C# Version Open

Delphi Version Open

Visual Basic .NET Version Open

Visual C++ 7.x with Managed Extensions Version Open

RemObject Chrome Version Open


이제 디스어셈블링 외에 또 다른 편리한 기능인 Analyze 기능을 살펴보도록 하겠습니다. Analyze는 다양한 분석 옵션을 지원합니다. 주로 종속 관계를 조사하는 경우가 많으며 다른 유용한 분석 옵션도 제공합니다.

모든 항목에 대하여
* Depends On: 선택한 항목이 필요로 하는 다른 항목들입니다.
* Used By: 선택한 항목이 반드시 필요한 다른 항목들입니다.

클래스/구조체/대리자/나열 상수/인터페이스 전용
* Exposed By: 선택한 형식을 인수로 받아들이거나 반환하는 멤버 함수 및 프로퍼티들을 조사합니다.
* Instaniated By: 선택한 형식의 객체를 생성하는 멤버 함수 및 프로퍼티들을 조사합니다. 여기에는 현재 선택한 형식을 상속받는 자식 클래스의 생성자들도 모두 포함됩니다.

네임스페이스 전용
* Depends On: 현재 선택한 네임스페이스가 아닌 다른 네임스페이스 및 어셈블리들을 대상으로 이 네임스페이스 안의 개체들이 반드시 필요한 항목들입니다.

모듈 및 어셈블리 전용
* P/Invoke Imports: 해당 모듈이 System.Runtime.InteropServices.DllImportAttribute로 가져온 DLL 파일 및 참조한 DLL 함수들의 목록을 나타냅니다. 여기서 조사할 수 있는 내용은 Visual Studio에서 제공하는 Depency Walker나 Binary Dump Utility로는 조사할 수 없는 내용입니다.

Analyze 기능을 사용하기 위하여 다음의 그림과 같이 사용하면 됩니다.

사용자 삽입 이미지

그리고 위와 같은 방식으로 여러 개의 항목을 분석하도록 지정하면 Analyzer 창에 여러 항목을 쌓아둘 수 있습니다.

사용자 삽입 이미지

그리고 한 가지 더 유용한 정보를 알려드리면 위의 팝업 메뉴 가장 끝 항목인 Search MSDN 메뉴도 같이 활용하시면 좋습니다. 물론 MSDN이 모든 내용을 가지고 있는 것은 아니지만 적어도 BCL을 탐색하는 동안 MSDN과 비교하여 내용을 살펴보면 도움이 되는 점이 많습니다.

긴 글을 읽어주셔서 감사합니다. 다음 강좌에서는 Reflector의 리소스 분석 기능과 다양한 플러그인을 소개하는 시간을 가지도록 하겠습니다. :-)
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Windows Azure MVP 남정현 (rkttu.com)
Reflector는 닷넷 기반 프로그램을 분석하는 종합적인 소프트웨어 검사 도구입니다. Reflector는 Lutz Roeder에 의해 개발되었고 지속적인 버전 업그레이드 결과 현재 메이저 버전 5라는 적지 않은 역사를 가지고 있습니다. 무엇보다도 Reflector가 인기있는 이유는 다른 유사한 유틸리티들 모두가 상용인것과는 대조적으로 Reflector는 처음부터 지금까지 프리웨어이기 때문이고 공개된 플러그인 개발 시스템을 지원하므로 나날이 인기가 오르고 있습니다.

Reflector를 처음 실행하면 다음과 같은 화면을 볼 수 있습니다.

사용자 삽입 이미지


기본 목록에서 사용할 어셈블리 그룹을 선택하는 대화 상자가 나타납니다. .NET Framework 1.1, 2.0, 3.0은 물론 PDA 및 스마트 폰을 위한 .NET Compact Framework 1.0, 2.0을 선택할 수 있습니다. 만약 Mono Framework가 설치되어있다면 여기에도 나타나게 됩니다.

Visual Studio .NET 2003을 사용 중이면 .NET Framework 1.1을 선택하시고, Visual Studio 2005만을 사용 중이면 .NET Framework 2.0을, Windows SDK 및 Orcas Extension Toolkit을 Visual Studio 2005 위에 설치했다면 .NET Framework 3.0을 선택하면 적당합니다.

여기서는 .NET Framework 3.0을 선택해보기로 합니다.

사용자 삽입 이미지

화면의 구성 요소들을 하나씩 나누어 살펴보도록 하겠습니다.

사용자 삽입 이미지

제목 표시줄 아래에 두 줄의 도구 모음을 볼 수 있습니다. File, View, Tools, Help는 메뉴 모음이며 여기에 Reflector의 주요 기능들이 모두 포함되어있습니다. 메뉴의 구성을 살펴보면 대략 다음과 같습니다.

사용자 삽입 이미지
File - Open 메뉴: C#, VB.NET 등 닷넷 컴파일러로 컴파일한 EXE 또는 DLL 파일을 열거나 Reflector 어셈블리 목록 파일을 열어서 현재 목록에 추가합니다.

File - Open Cache 메뉴: Global Assembly Cache 및 Visual Studio .NET Assembly Cache에 등록된 어셈블리를 조회합니다. 주로 시스템에서 공용으로 사용하는 어셈블리들을 이곳에서 쉽게 찾을 수 있습니다.

File - Open List 메뉴: Reflector 프로그램이 직접 관리하는 리스트 목록을 보여주고 관리합니다. 이 메뉴를 사용하지 않고 Reflector를 처음 기능 그대로 사용하면 계속 "Default" 목록을 이용하는 것입니다.

File - Close 메뉴: 현재 목록에서 특정 어셈블리를 제거합니다. 여기에서 항목을 제거하더라도 실제로 제거되는 것은 아니며 단지 현재 Reflector 프로그램의 메모리로부터 해제하는 것일 뿐입니다.

File - Exit 메뉴: Reflector를 종료합니다.

사용자 삽입 이미지
View - Bookmarks 메뉴: 특정 어셈블리의 특정 형식 (클래스, 구조체, 인터페이스, 나열 상수, 대리자 등) 안의 멤버를 북마크에 등록해두었을 경우 이 메뉴로 탐색할 수 있습니다.

View - Search 메뉴: 현재 열려있는 어셈블리들의 모든 형식과 멤버들을 검색합니다. 열려있는 어셈블리의 수와 형식, 멤버의 수에 비례하여 검색 소요 시간이 증가합니다.

View - Refresh 메뉴: 현재 열려있는 어셈블리들을 모두 다시 읽어들입니다.

View - Back 메뉴: 여러 멤버들을 탐색하였을 경우 탐색 기록이 Reflector에 의하여 자동으로 남게되는데, 이것을 기준으로 인터넷 브라우저에서처럼 현재 탐색 중인 멤버 이전에 보았던 멤버로 이동합니다.

View - Forward 메뉴: 여러 멤버들을 탐색하였을 경우 탐색 기록이 Reflector에 의하여 자동으로 남게되는데, 이것을 기준으로 인터넷 브라우저에서처럼 현재 탐색 중인 멤버 다음에 보았던 멤버로 이동합니다.

View - Add-Ins 메뉴: 추가 기능 관리자를 엽니다. 추가 기능에 대한 자세한 내용은 나중에 따로 살펴보기로 합니다.

View - Options 메뉴: Reflector의 동작 옵션을 설정합니다.

사용자 삽입 이미지
Tools - Disassemble 메뉴: 형식명 위에서 이 메뉴를 선택하면 형식 안의 모든 멤버 및 하위 형식들을 현재 선택한 언어로 프로토타입으로 표기합니다. 특정 멤버 위에서 이 메뉴를 선택하면 특정 언어로 실제 소스 코드를 역 컴파일하여 표시합니다. 이 기능에 대해서는 나중에 따로 살펴보기로 하겠습니다.

Tools - Analyze 메뉴: 현재 선택한 항목을 기준으로 종속 관계 (현재 항목이 완전하기 위하여 필요한 다른 항목 - 또는 - 현재 항목이 다른 항목에 대하여 어떻게 사용되는가에 대한 분포)를 조사하고 어셈블리의 경우 관련된 어셈블리 및 해당 어셈블리가 참조하는 플랫폼 호출 멤버 (Win32 DLL에 대한 참조)들을 조사합니다.

Tools - Search Google 메뉴: 선택한 항목을 Google 검색 엔진의 키워드로 활용하여 검색을 시작합니다. 인터넷에 연결되어있어야 이 기능을 사용할 수 있습니다.

Tools - Search MSDN 메뉴: 선택한 항목을 MSDN Library 검색 엔진의 키워드로 활용하여 검색을 시작합니다. 인터넷에 연결되어있어야 이 기능을 사용할 수 있습니다.

사용자 삽입 이미지
Help - Send Feedback 메뉴: 프로그램 개발자(?)에게 직접 프로그램에 대한 의견, 버그, 개선 사항을 보냅니다. 영어로 보내는 것이 합당하겠지요? :-)

Help - Check for Updates 메뉴: Reflector의 최신 버전을 확인합니다. 최신 버전이 있으면 자동으로 업데이트까지 해줍니다. 이 메뉴를 이용하지 않더라도 프로그램을 시작하면 자동으로 검사합니다. (단, 인터넷에 연결되어있어야 합니다.)

Help - About .NET Reflector 메뉴: Reflector의 버전 정보 및 저작권 정보를 나타내는 대화 상자를 봅니다.

이어서 도구 모음들을 살펴보겠습니다.

사용자 삽입 이미지

메뉴에서 살펴본 기능들 중 몇 가지 자주 사용하는 기능들을 따로 내어놓은 것을 볼 수 있습니다. 뒤로 가기, 앞으로 가기, 어셈블리 추가, 새로 고침, 북마크 창 열기, 검색, 프로그램 옵션 설정, 피드백 보내기는 기본적으로 메뉴와 동일한 기능들입니다. 여기에 특이한 드롭다운 컨트롤 하나가 보이는데, 처음에는 "C#"으로 쓰여있는 드롭다운 컨트롤이 있을 것입니다. 펼쳐보면 아래와 같이 나타납니다.

사용자 삽입 이미지
어떤 언어로 디스어셈블한 결과를 표현할 지를 나타내는 부분입니다. 보기에 편리한 언어를 선택하면 되는데 주로 C#을 선택하는 경우가 많습니다. IL은 MSIL을 의미하며 이것을 선택하고 디스어셈블을 시도하면 기본 유틸리티인 ildasm과 비슷하게 사용할 수 있습니다. C#, Visual Basic은 우리가 알고 사용하는 언어와 같습니다. 물론 VB는 VB.NET을 의미하겠지요. MC++은 Visual C++의 .NET 프로그래밍 확장을 의미하는데, Reflector는 MC++ 1.x의 문법을 기준으로 표현합니다. Delphi는 Delphi의 .NET 확장을 기반으로 표현하는 것을 의미합니다. (실제로 Delphi는 Win32 모드와 .NET 모드로 나뉘어져 있습니다.) Chrome은 Delphi와 유사하지만 원래의 Object Pascal에 더 가까운 언어입니다.

Reflector를 실제로 활용하는 모습은 다음과 같습니다.

사용자 삽입 이미지

다음 단원에서는 Reflector를 이용하여 디스어셈블하여 내용을 살펴보는 방법을 살펴보고 Analyze 기능의 활용 사례를 보기로 합니다.
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Windows Azure MVP 남정현 (rkttu.com)