2012-05-16 3 views
2

최근 동적 방법을 위해 IL을 검사하기 위해 VS2010에서 ILVisualizer를 사용하기 시작했습니다. 그러나 일리노이 스트림에서 LocalVariable 정보를 추출하지 않습니다. 그래서 시도해 봅니다. (재미있게 배우고 좋은 학습 경험을 가지고 있기 때문에) 좋은 결과를 얻을 수 있기 때문에 좋은 결과를 얻을 수 있습니다.DynamicMethod의 LocalSignature : 비표준 유형 토큰을 읽으시겠습니까?

정적으로 컴파일 된 메서드의 경우 문제는 GetMethodBody()를 통해 메서드의 본문에 액세스하고 거기에서 로컬 변수를 가져올 수 있기 때문입니다.

그러나 DynamicMethod에서는 메서드 본문을 GetMethodBody()를 통해 사용할 수 없습니다. 내가 바이트 배열로 로컬 서명을 얻는 해결 방법을 발견하고 거기에서 CIL 스펙에 따라 메서드의 로컬에 대한 개수, 유형 및 인덱스를 추출 할 수 있습니다. 네이티브 형식 (short, byte, string ...)을 처리하는 동안 모두 잘됩니다.

로컬 변수가 클래스 유형 인 경우 로컬 서명 내의 ELEMENT_TYPE_CLASS 대신 ELEMENT_TYPE_INTERNAL (0x21) 플래그로 참조됩니다.

불행히도 ELEMENT_TYPE_INTERNAL (으)로 저장된 유형을 읽는 방법을 찾지 못했습니다. 그게 뭐예요? MS는 동적 방법에 대해 비표준 CIL을 사용합니까? 누구나 그 서명을 올바르게 읽을 수있는 방법을 알고 있습니까?

편집 나는 mscorlib.dll에 대한 몇 가지 소스 파일을 우연히 발견하고, 클래스가 실행시의 형태 일 때이 가능하게 일어나는 것을 SignatureHelper의 소스에서 발견했다. 나는 그것에 대해 조사 할 것이다 ...

답변

1

글쎄, 나는 그것을 얻었다 고 생각한다!

ELEMENT_TYPE_INTERNAL 플래그 다음의 데이터는 압축 된 데이터가 아닙니다. 이는 4 바이트에 저장된 일반 32 비트 정수 (또는 플랫폼에 따라 64이지만 확인해야하지만)입니다. 참조 된 유형에 대한 포인터.

IntPtr에서 RuntimeTypeHandle을 얻는 방법을 찾을 수는 없지만 메서드의 DynamicScope 객체에서 토큰을 반복하고 값을 비교하면 형식 핸들을 얻을 수 있습니다.