성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] Java - How to use the Foreign Funct...
[정성태] 제가 큰 실수를 했군요. ^^; Delegate를 통한 Bein...
[정성태] Working with Rust Libraries from C#...
[정성태] Detecting blocking calls using asyn...
[정성태] 아쉽게도, 커뮤니티는 아니고 개인 블로그입니다. ^^
[정성태] 질문이 잘 이해가 안 됩니다. 우선, 해당 소스코드에서 ILis...
[양승조
] var대신 dinamic으로 선언해서 해결은 했습니다. 맞는 해...
[양승조
] 또 막혔습니다. ㅠㅠ var list = props[i].Ge...
[양승조
] 아. 감사합니다. 어제는 안됐던것 같은데....정신을 차려야겠네...
[정성태] "props[i].GetValue(props[i])" 코드에서 ...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>닷넷 - 메서드의 메타 데이터 토큰 값으로 클래스를 찾아내는 방법</h1> <p> 지난번 글에서 언급한 문제를 다시 짚어 보겠습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Watson Bucket 정보를 이용한 CLR 응용 프로그램 예외 분석 - (2) ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/1096'>http://www.sysnet.pe.kr/2/0/1096</a> </pre> <br /> 다시 정리해 보면, P7(MethodDef)가 포함하고 있는 토큰값(971)에 해당하는 메서드는 ildasm.exe에서 쉽게 찾아낼 수 있었지만 정작 그 메서드를 포함하고 있는 클래스에 대한 정보는 구할 수 없었다는 것인데요.<br /> <br /> 그냥 넘어갈까 하다가 ^^, 왠지 정리를 해두어야 할 것 같아서 좀 더 살펴본 끝에 제법 간단한 방법을 찾아낼 수 있었습니다.<br /> <br /> 역시나 ildasm.exe를 이용하는 방법인데, GUI 버전을 사용하기 보다는 아예 출력 결과를 텍스트 파일로 보내는 것으로 해결했습니다.<br /> <br /> 예를 들어, 지난번 문제라면 다음과 같이 명령어를 줄 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > ildasm <span style='color: blue; font-weight: bold'>/output=test.log</span> system.data.dll /pubonly <span style='color: blue; font-weight: bold'>/tokens</span> "/bytes" 옵션을 주면 메서드의 signature까지 확인할 수 있습니다. </pre> <br /> (/pubonly 옵션은, 찾으려는 그 메서드가 public 제한자를 가지는 경우라면 /output으로 지정된 파일의 크기를 감안할 때 가급적 설정해 주는 것이 권장됩니다.)<br /> <br /> 일단, 이렇게 해서 test.log 파일을 얻었으면 편집기에서 그 파일을 열어 "06000971" 메서드 정보를 찾아보는데, 실제로 다음과 같이 검색이 됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > .method /*060004F6*/ public hidebysig specialname instance string get_Namespace() cil managed { // Code size 50 (0x32) .maxstack 2 IL_0000: ldarg.0 IL_0001: ldfld string System.Data.DataColumn/*02000068*/::_columnUri /* 040006DD */ IL_0006: brtrue.s IL_002b ...[생략]... IL_0019: ldarg.0 IL_001a: call instance class System.Data.DataTable/*02000099*/ System.Data.DataColumn/*02000068*/::get_Table() /* 06000500 */ <span style='color: blue; font-weight: bold'>IL_001f: callvirt instance string System.Data.DataTable/*02000099*/::get_Namespace() /* 06000971 */</span> IL_0024: ret IL_0025: ldstr "" /* 700007CD */ IL_002a: ret ...[생략]... } </pre> <br /> 아하~~~, 대번에 결과가 나왔습니다. 보시는 것처럼 System.Data.DataTable에 속한 것임을 알 수 있는데요. (그래도 무시하고 ^^) 계속 검색을 해보면, 다음과 같이 원본 메서드의 IL 코드 정의까지 찾아낼 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > <span style='color: blue; font-weight: bold'>.method /*06000971*/ public hidebysig specialname instance string get_Namespace() cil managed</span> { // Code size 27 (0x1b) .maxstack 2 IL_0000: ldarg.0 IL_0001: ldfld string System.Data.DataTable/*02000099*/::tableNamespace /* 040007B4 */ IL_0006: brtrue.s IL_0014 IL_0008: ldarg.0 IL_0009: newobj instance void class [mscorlib/*23000001*/]System.Collections.Generic.List`1/*01000074*/<class System.Data.DataTable/*02000099*/>/*1B000024*/::.ctor() /* 0A000191 */ IL_000e: call instance string System.Data.DataTable/*02000099*/::GetInheritedNamespace(class [mscorlib/*23000001*/]System.Collections.Generic.List`1/*01000074*/<class System.Data.DataTable/*02000099*/>) /* 06000970 */ IL_0013: ret IL_0014: ldarg.0 IL_0015: ldfld string System.Data.DataTable/*02000099*/::tableNamespace /* 040007B4 */ IL_001a: ret } <span style='color: blue; font-weight: bold'>// end of method DataTable::get_Namespace</span> </pre> <br /> 위의 정보에서도 역시 DataTable에 속한다는 것을 알려주는 각종 의미 있는 문자열들이 포함되어 있습니다. 확실하게 마무리 하고 싶다면, 위의 메서드 정의를 찾은 라인으로부터 이전 방향으로 ".class"라는 문자열로 검색하는 경우, 다음과 같이 get_Namespace를 포함하고 있는 클래스에 대한 정의를 찾아낼 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > <span style='color: blue; font-weight: bold'>.class /*02000099*/ public auto ansi serializable beforefieldinit System.Data.DataTable</span> extends [System/*23000002*/]System.ComponentModel.MarshalByValueComponent/*01000047*/ implements [System/*23000002*/]System.ComponentModel.IListSource/*0100004F*/, [System/*23000002*/]System.ComponentModel.ISupportInitializeNotification/*01000051*/, [System/*23000002*/]System.ComponentModel.ISupportInitialize/*01000052*/, [mscorlib/*23000001*/]System.Runtime.Serialization.ISerializable/*01000053*/, [System.Xml/*23000004*/]System.Xml.Serialization.IXmlSerializable/*01000050*/ { ...[생략]... .method /*06000971*/ public hidebysig specialname instance string get_Namespace() cil managed ...[생략]... } </pre> <br /> 이 정도면... 더 이상 알아볼 필요 없겠지요. ^^<br /> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
1944
(왼쪽의 숫자를 입력해야 합니다.)